Voir le contenu de la base de données en mémoire H2 ou HSQLDB
y a-t-il un moyen de parcourir le contenu D'une base de données en mémoire H2 ou HSQLDB pour le visualiser? Par exemple, lors d'une session de débogage avec hibernation afin de vérifier quand la chasse d'eau est exécutée; ou pour s'assurer que le script qui instancie la base de données donne le résultat attendu.
existe-T-elle un addon ou une bibliothèque que vous pouvez intégrer à votre code afin de permettre cela?
s'il vous plaît, mentionnez de laquelle vous parlez (H2 ou HSQLDB) en le cas où vous avez une réponse spécifique à l'un d'eux.
9 réponses
vous pouvez exécuter H2 serveur web dans votre application qui accédera à la même base de données en mémoire. Vous pouvez également accéder au H2 en mode serveur en utilisant n'importe quel client JDBC générique comme SquirrelSQL .
mise à jour:
Server webServer = Server.createWebServer("-web,-webAllowOthers,true,-webPort,8082").start();
Server server = Server.createTcpServer("-tcp,-tcpAllowOthers,true,-tcpPort,9092").start();
maintenant vous pouvez vous connecter à votre base de données via L'URL jdbc:h2:mem:foo_db
dans le même processus ou parcourir la base de données foo_db
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 le ressort:
<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 vous ne devez dépendre que des assertions et non pas de la consultation manuelle du contenu de la base de données. Utilisez ceci seulement pour le dépannage.
N.B. si vous utilisez Spring test framework vous ne verrez pas les changements effectués par une transaction en cours et cette transaction sera reconduite immédiatement après le test.
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 de base de données. Vous pouvez ajouter cette ligne à votre code, ou comme' watch expression '(dynamiquement):
org.h2.tools.Server.startWebServer(conn);
l'outil serveur lancera un navigateur Web localement qui vous permettra d'accéder à la base de données.
en H2, ce qui fonctionne pour moi est:
code I, démarrer le serveur comme:
server = Server.createTcpServer().start();
qui démarre le serveur sur le port localhost
9092.
puis, en code, établir 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, en tant que client pour inspecter la base de données j'utilise celle fournie par H2, ce qui est suffisant, pour le lancer vous avez juste besoin de lancer le Main java suivant séparément
org.h2.tools.Console
ce sera 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 le DB
avec HSQLDB, vous avez plusieurs options intégrées.
il y a deux gestionnaires de base de données de L'interface graphique et une interface en ligne de commande pour la base de données. Les classes pour ceux-ci sont:
org.hsqldb.util.DatabaseManager
org.hsqldb.util.DatabaseManagerSwing
org.hsqldb.cmdline.SqlTool
vous pouvez démarrer l'un des 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 pointant vers une base de données en mémoire.
org.hsqldb.Server
vous pouvez l'exposer comme une fonctionnalité JMX, startable via 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);
}
}
XML context:
<context:component-scan base-package="your.package.root" scoped-proxy="targetClass"/>
<context:annotation-config />
<context:mbean-server />
<context:mbean-export />
il s'agit d'un contrôleur Play 2 pour initialiser les serveurs TCP et Web H2:
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 <mrsarm@gmail.com>
*/
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");
}
}
}
pour HSQLDB, ce qui suit a fonctionné pour moi:
DatabaseManager.threadedDBM();
et cela a soulevé L'interface graphique avec mes tableaux et données.
j'ai aussi essayé la version Swing, mais elle avait seulement un main
, et je n'étais pas sûr des arguments à passer. Si quelqu'un sait, merci de poster ici.
juste parce que j'ai cherché pendant des heures le bon nom de base de données: le nom de la base de données est le nom de votre source de données. Alors essayez avec URL jdbc: hsqldb:mem: dataSource si vous avez une source de données avec id=dataSource. Si cela ne fonctionne pas, essayez testdb qui est la valeur par défaut.
j'ai un problème avec H2 version 1.4.190 connexion à distance à inMemory (ainsi que dans le fichier) avec Connection is broken: "unexpected status 16843008"
jusqu'à ce que ne pas descendre à 1.3.176. Voir Grails accédant au serveur TCP H2 hangs
Je ne sais pas pourquoi il fonctionne bien à vos machines, mais j'ai dû passer une journée pour obtenir il fonctionne.
le serveur fonctionne avec Intellij Idea U via l'url "jdbc:h2: tcp://localhost: 9092/~/default".
"localhost:8082" dans le navigateur alse fonctionne très bien.
j'ai ajouté ceci dans le mvc-répartiteur-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>