94 votes

Visualisation du contenu de la base de données en mémoire H2 ou HSQLDB

Existe-t-il un moyen de parcourir le contenu d'une base de données en mémoire H2 ou HSQLDB pour le consulter ? Par exemple, pendant une session de débogage avec Hibernate afin de vérifier quand le flush est exécuté ; ou pour s'assurer que le script qui instancie la BD donne le résultat attendu.

Existe-t-il un addon ou une bibliothèque que vous pouvez intégrer à votre code afin de permettre cela ?

Veuillez préciser de quel système il s'agit (H2 ou HSQLDB) au cas où vous auriez une réponse spécifique à l'un d'entre eux.

0 votes

Cela répond-il à votre question ? Inspecter en mémoire hsqldb pendant le débogage

63voto

Tomasz Nurkiewicz Points 140462

Vous pouvez exécuter H2 serveur web dans votre application qui accéderont à la même base de données en mémoire. Vous pouvez également accéder à H2 en mode serveur à l'aide de n'importe quel client JDBC générique tel que SquirrelSQL .

UPDATE :

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

Vous pouvez maintenant vous connecter à votre base de données via jdbc:h2:mem:foo_db dans le même processus ou parcourir le foo_db base de données en utilisant localhost:8082 . N'oubliez pas de fermer les deux serveurs. Voir aussi : La base de données H2 en mode mémoire n'est pas accessible par la console. .

Vous pouvez également utiliser Spring :

<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>

En fait, vous ne devriez vous fier qu'aux assertions et non à l'examen manuel du contenu de la base de données. Ne l'utilisez que pour le dépannage.

N.B. Si vous utilisez le cadre de test de Spring, vous ne verrez pas les changements effectués par une transaction en cours d'exécution et cette transaction sera annulée immédiatement après le test.

2 votes

J'ai obtenu l'erreur que "true" est une option invalide. L'option -webAllowOthers prenait-elle un paramètre ? Avec le dernier code H2, il ne prend aucun paramètre. Regardez la méthode "main" ici : h2database.com/javadoc/org/h2/tools/Server.html

1 votes

Comme hman l'a mentionné, la dernière version n'accepte pas le paramètre "true", il suffit donc de le supprimer : <constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>

2 votes

Les nouvelles versions suivent la convention des arguments séparés de Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")

35voto

Thomas Mueller Points 18666

Pour H2, vous pouvez démarrer un serveur web dans votre code pendant une session de débogage si vous avez un objet de connexion à la base de données. Vous pouvez ajouter cette ligne à votre code, ou comme une "expression de surveillance" (dynamiquement) :

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

L'outil serveur démarre localement un navigateur web qui vous permet d'accéder à la base de données.

6 votes

Commentaire pour ceux qui utilisent Spring Data - vous pouvez obtenir la connexion à partir de l'ApplicationContext de cette façon : ((DataSource)context.getBean("dataSource")).getConnection()

0 votes

C'est également très bien dans un TestWatcher JUnit @Rule

3 votes

Cela fonctionne même si vous le lancez avec "evaluateExpression" dans intelliJ tout en déboguant. (bloque le reste des montres jusqu'à ce qu'elles soient arrêtées)

10voto

dsantaolalla Points 73

Au H2, ce qui marche pour moi c'est :

Je code, en démarrant le serveur comme :

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

Cela démarre le serveur sur localhost port 9092.

Puis, dans le code, établissez une connexion DB sur l'URL JDBC suivante :

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

Pendant le débogage, comme client pour inspecter la base de données, j'utilise celui fourni par H2, qui est assez bon. Pour le lancer, il suffit de lancer séparément le main java suivant

org.h2.tools.Console

Cela va démarrer un serveur web avec une application sur 8082, lancer un navigateur sur localhost:8082

Et ensuite vous pouvez entrer l'URL précédente pour voir la BD

4voto

fredt Points 10785

Avec HSQLDB, vous disposez de plusieurs options intégrées.

Il existe deux gestionnaires de base de données GUI et une interface de ligne de commande pour la base de données. Les classes pour ces derniers sont :

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

Vous pouvez lancer l'un des programmes ci-dessus à partir de votre application et accéder aux bases de données en mémoire.

Un exemple avec JBoss est donné ici :

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

Vous pouvez également démarrer un serveur avec votre application, en le faisant pointer vers une base de données en mémoire.

org.hsqldb.Server

0 votes

D'après la documentation, vous pouvez utiliser un "manager" avec n'importe quelle connexion JDBC, donc cela fonctionnerait aussi pour H2 :) hsqldb.org/doc/2.0/util-guide/dbm-chapt.html

4voto

Knownasilya Points 998

Pour HSQLDB, ce qui suit a fonctionné pour moi :

DatabaseManager.threadedDBM();

Et cela a fait apparaître l'interface graphique avec mes tables et mes données une fois que je l'ai dirigée vers la bonne base de données in-mem.

C'est essentiellement l'équivalent d'une mise à jour d'une DatabaseManager (la variété non Swing), qui demande les détails de la connexion, et est réglé sur --noexit )

J'ai également essayé la version Swing, mais elle n'avait qu'une main et je n'étais pas sûr des arguments à faire passer. Si quelqu'un le sait, merci de poster ici.

Juste parce que j'ai cherché pendant des heures le bon nom de la base de données : Le nom de la base de données est le nom de votre source de données. Essayez donc avec l'URL jdbc:hsqldb:mem:dataSource si vous avez un bean de source de données avec id=dataSource. Si cela ne fonctionne pas, essayez testdb qui est la valeur par défaut.

4 votes

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

0 votes

Voici quelques explications sur les paramètres : stackoverflow.com/a/3076005/32453

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X