2011-09-05 9 views
74

C'è un modo per sfogliare il contenuto di un database H2 o HSQLDB in memoria per la visualizzazione? Ad esempio, durante una sessione di debug con Hibernate per verificare quando viene eseguito il flush; o per assicurarsi che lo script che crea un'istanza del DB dia il risultato atteso.Visualizza contenuto del database in memoria H2 o HSQLDB

Esiste un addon o una libreria che è possibile incorporare con il proprio codice per consentire ciò?

Si prega di indicare quale si sta parlando (H2 o HSQLDB) nel caso in cui si abbia una risposta specifica per uno di essi.

risposta

46

È possibile eseguire H2 web server all'interno dell'applicazione che accederà allo stesso database in memoria. È anche possibile accedere a H2 in esecuzione in modalità server utilizzando qualsiasi client JDBC generico come SquirrelSQL.

UPDATE:

Server webServer = Server.createWebServer("-web,-webAllowOthers,true,-webPort,8082").start(); 
Server server = Server.createTcpServer("-tcp,-tcpAllowOthers,true,-tcpPort,9092").start(); 

Ora è possibile connettersi al database tramite jdbc:h2:mem:foo_db URL all'interno dello stesso processo o sfogliare il nostro catalogo foo_db utilizzando localhost:8082. Ricordarsi di chiudere entrambi i server. Vedi anche: H2 database in memory mode cannot be accessed by Console.

È inoltre possibile utilizzare Primavera:

<bean id="h2Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop" depends-on="h2WebServer"> 
    <constructor-arg value="-tcp,-tcpAllowOthers,true,-tcpPort,9092"/> 
</bean> 
<bean id="h2WebServer" class="org.h2.tools.Server" factory-method="createWebServer" init-method="start" destroy-method="stop"> 
    <constructor-arg value="-web,-webAllowOthers,true,-webPort,8082"/> 
</bean> 

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" depends-on="h2Server"> 
    <property name="driverClass" value="org.h2.Driver"/> 
    <property name="jdbcUrl" value="jdbc:h2:mem:foo_db"/> 
</bean> 

BTW si dovrebbe dipendere solo su affermazioni e non sui manuali sbirciare il contenuto del database. Utilizzare questo solo per la risoluzione dei problemi.

N.B. se si utilizza il framework Spring test, non si vedranno le modifiche apportate da una transazione in esecuzione e questa transazione verrà annullata immediatamente dopo il test.

+2

ho ottenuto l'errore che la "vera" è un'opzione valida. Did-webAllowOthers usato per prendere parametro? Con l'ultimo codice H2, non richiede alcun parametro. Guarda il metodo "main" qui: http://www.h2database.com/javadoc/org/h2/tools/Server.html – hshib

+1

Come menzionato da hman, l'ultima versione non accetta il parametro "true" quindi basta rimuoverlo: '< constructor-arg value = "- web, -webAllowOthers, -webPort, 8082" /> ' –

+1

Le nuove versioni seguono la convenzione argomento separato di ' Server.createTcpServer ("- tcpPort", "9092", "-tcpAllowOthers") ' ' Server.createWebServer ("- webPort", "8082", "-tcpAllowOthers") ' – Jor

4

Con HSQLDB sono disponibili diverse opzioni.

Ci sono due gestori di database GUI e un'interfaccia a riga di comando per il database. Le classi per queste sono:

org.hsqldb.util.DatabaseManager 
org.hsqldb.util.DatabaseManagerSwing 
org.hsqldb.cmdline.SqlTool 

È possibile avviare uno dei suddetti dalla propria applicazione e accedere ai database in memoria.

Un esempio con JBoss è dato qui:

http://docs.jboss.org/jbpm/v3.2/userguide/html/ch07s03.html

si può anche iniziare un server con l'applicazione, che punta a un database in memoria.

org.hsqldb.Server 
24

Per H2, è possibile start a web server within your code nel corso di una sessione di debug, se si dispone di un oggetto di connessione al database. Si potrebbe aggiungere questa linea al vostro codice, o come un 'espressione orologio' (dinamico):

org.h2.tools.Server.startWebServer(conn); 

Lo strumento Server verrà avviato un browser web in locale che permette di accedere al database.

+2

Commento per coloro che utilizzano Spring Data - è possibile ottenere la connessione da ApplicationContext in questo modo: ((DataSource) context.getBean ("dataSource")). GetConnection() – Odysseus

+0

questo è ottimo anche in JUnit TestWatcher @Rule – weberjn

+1

Funziona anche se lo si utilizza con "evaluateExpression" in intelliJ durante il debug. (blocca il resto degli orologi fino all'arresto) – borjab

1

Per HSQLDB, i seguenti ha lavorato per me:

DatabaseManager.threadedDBM(); 

E questo ha portato la GUI con le mie tabelle e dati.

Ho anche provato la versione Swing, ma aveva solo un main, e non ero sicuro degli argomenti da passare. Se qualcuno lo sa, per favore pubblica qui.

Solo perché ho cercato per ore il nome del database corretto: il nome del database è il nome della fonte dati. Quindi prova con l'URL jdbc: hsqldb: mem: dataSource se hai un bean di origine dati con id = dataSource. Se questo non funziona, prova testdb che è l'impostazione predefinita.

+2

org.hsqldb.util.DatabaseManagerSwing.main (new String [] {"--url", URL, "user ", USERNAME," --password ", PASSWORD}) ; –

7

In H2, ciò che funziona per me è:

codice che ho, l'avvio del server, come:

server = Server.createTcpServer().start(); 

che avvia il server sulla porta localhost 9092.

Poi, nel codice, stabilire una connessione DB sul seguente URL JDBC:

jdbc:h2:tcp://localhost:9092/mem:test;DB_CLOSE_DELAY=-1;MODE=MySQL 

Mentre deb ugging, come un client per ispezionare il DB io uso quello fornito da H2, che è abbastanza buono, per lanciarlo è sufficiente lanciare il seguente principale java separatamente

org.h2.tools.Console 

Questo avvierà un server web con un app sul 8082, avviare un browser su localhost:8082

e quindi è possibile inserire l'URL precedente per vedere il DB

3

è possibile esporla come una caratteristica JMX, avviabile tramite JConsole:

@ManagedResource 
@Named 
public class DbManager { 

    @ManagedOperation(description = "Start HSQL DatabaseManagerSwing.") 
    public void dbManager() { 
     String[] args = {"--url", "jdbc:hsqldb:mem:embeddedDataSource", "--noexit"}; 
     DatabaseManagerSwing.main(args); 
    } 
} 
contesto

XML:

<context:component-scan base-package="your.package.root" scoped-proxy="targetClass"/> 
<context:annotation-config /> 
<context:mbean-server /> 
<context:mbean-export /> 
+2

Questo è in realtà un bel trucco! – jplandrain

2

Questo è un controller Play 2 per inizializzare il H2 TCP e server Web:

package controllers; 

import org.h2.tools.Server; 
import play.mvc.Controller; 
import play.mvc.Result; 

import java.sql.SQLException; 

/** 
* Play 2 controller to initialize H2 TCP Server and H2 Web Console Server. 
* 
* Once it's initialized, you can connect with a JDBC client with 
* the URL `jdbc:h2:tcp://127.0.1.1:9092/mem:DBNAME`, 
* or can be accessed with the web console at `http://localhost:8082`, 
* and the URL JDBC `jdbc:h2:mem:DBNAME`. 
* 
* @author Mariano Ruiz <[email protected]> 
*/ 
public class H2ServerController extends Controller { 

    private static Server h2Server = null; 
    private static Server h2WebServer = null; 

    public static synchronized Result debugH2() throws SQLException { 
     if (h2Server == null) { 
      h2Server = Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9092"); 
      h2Server.start(); 
      h2WebServer = Server.createWebServer("-web","-webAllowOthers","-webPort","8082"); 
      h2WebServer.start(); 
      return ok("H2 TCP/Web servers initialized"); 
     } else { 
      return ok("H2 TCP/Web servers already initialized"); 
     } 
    } 
} 
1

Ho un problema con la versione 1.4.190 H2 connessione remota a INT (così come nel file) con Connection is broken: "unexpected status 16843008" finché non eseguire il downgrade a 1.3.176. Vedi Grails accessing H2 TCP server hangs

0

Non so perché funzioni bene con le vostre macchine, ma ho dovuto passare un giorno per farlo funzionare.

Il server funziona con Intellij Idea U tramite url "jdbc: h2: tcp: // localhost: 9092/~/default".

"localhost: 8082" nel browser funziona correttamente.

ho aggiunto questo nel MVC-dispatcher-servlet.xml

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" depends-on="h2Server"> 
    <property name="driverClassName" value="org.h2.Driver"/> 
    <property name="url" value="jdbc:h2:tcp://localhost:9092/~/default"/> 
    <property name="username" value="sa"/> 
    <property name="password" value=""/> 
</bean> 

<bean id="h2Server" class="org.h2.tools.Server" factory-method="createTcpServer" init-method="start" destroy-method="stop" depends-on="h2WebServer"> 
    <constructor-arg> 
     <array> 
      <value>-tcp</value> 
      <value>-tcpAllowOthers</value> 
      <value>-tcpPort</value> 
      <value>9092</value> 
     </array> 
    </constructor-arg> 
</bean> 

<bean id="h2WebServer" class="org.h2.tools.Server" factory-method="createWebServer" init-method="start" destroy-method="stop"> 
    <constructor-arg> 
     <array> 
      <value>-web</value> 
      <value>-webAllowOthers</value> 
      <value>-webPort</value> 
      <value>8082</value> 
     </array> 
    </constructor-arg> 
</bean> 
Problemi correlati