Afficher le contenu de la base de données en mémoire H2 ou HSQLDB

90

Existe-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 Hibernate afin de vérifier quand le flush est exécuté; ou pour vous assurer que le script qui instancie la base de données donne le résultat attendu.

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

Merci de mentionner celui dont vous parlez (H2 ou HSQLDB) au cas où vous auriez une réponse spécifique à l'un d'entre eux.

jplandrain
la source

Réponses:

59

Vous pouvez exécuter le serveur Web H2 dans votre application qui accédera à la même base de données en mémoire. Vous pouvez également accéder au H2 fonctionnant en mode serveur en utilisant n'importe quel client JDBC générique comme SquirrelSQL .

METTRE À JOUR:

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 une jdbc:h2:mem:foo_dbURL dans le même processus ou parcourir la foo_dbbase 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>

BTW, vous ne devriez dépendre que des assertions et non de la lecture manuelle du contenu de la base de données. Utilisez ceci uniquement pour le dépannage.

NB si vous utilisez le framework de test Spring, vous ne verrez pas les modifications apportées par une transaction en cours et cette transaction sera annulée immédiatement après le test.

Tomasz Nurkiewicz
la source
2
J'ai eu l'erreur que "vrai" est une option invalide. Est-ce que -webAllowOthers prenait des paramètres? Avec le dernier code H2, il ne prend aucun paramètre. Regardez la méthode "principale" ici: h2database.com/javadoc/org/h2/tools/Server.html
hshib
1
Comme hman mentionné, la dernière version n'accepte pas le paramètre "vrai", alors supprimez-le simplement:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R
2
Les nouvelles versions suivent la convention d'argument distincte de Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
Jor
7
En Java pur, vous devez supprimer le paramètre "true", et séparer les paramètres comme ceci:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre
2
Avec Spring Boot, vous pouvez simplement définir "h2.console.enabled: true" et "h2.console.path: h2-console" dans votre fichier application.properties.
user2754985
31

Pour H2, vous pouvez démarrer un serveur Web dans votre code pendant une session de débogage si vous disposez d'un objet de connexion à la base de données. Vous pouvez ajouter cette ligne à votre code ou en tant qu '«expression de surveillance» (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.

Thomas Mueller
la source
4
Commentaire pour ceux qui utilisent Spring Data - vous pouvez obtenir une connexion depuis ApplicationContext de cette manière: ((DataSource) context.getBean ("dataSource")). GetConnection ()
Odysseus
c'est aussi génial dans un JUnit TestWatcher @Rule
weberjn
3
Cela fonctionne même si vous le lancez avec "evaluExpression" dans intelliJ pendant le débogage. (verrouille le reste des montres jusqu'à l'arrêt)
borjab
9

En H2, ce qui fonctionne pour moi est:

Je code, en démarrant le serveur comme:

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

Cela démarre le serveur sur le localhostport 9092.

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

Lors du débogage, en tant que client pour inspecter la base de données, j'utilise celui fourni par H2, ce qui est assez bon, pour le lancer, il vous suffit de lancer le java main suivant séparément

org.h2.tools.Console

Cela démarrera un serveur Web avec une application sur 8082, lancera un navigateur sur localhost:8082

Et puis vous pouvez entrer l'URL précédente pour voir la base de données

dsantaolalla
la source
4

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 vers 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 éléments 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
Fredt
la source
3

Vous pouvez l'exposer en tant que fonctionnalité JMX, démarrable 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);
    }
}

Contexte XML:

<context:component-scan base-package="your.package.root" scoped-proxy="targetClass"/>
<context:annotation-config />
<context:mbean-server />
<context:mbean-export />
Sibidiba
la source
3

Il s'agit d'un contrôleur Play 2 pour initialiser les serveurs H2 TCP et 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");
        }
    }
}
Mariano Ruiz
la source
2

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

DatabaseManager.threadedDBM();

Et cela a amené l'interface graphique avec mes tables et mes données.

J'ai aussi essayé la version Swing, mais elle n'en avait qu'un main, et je n'étais pas sûr des arguments à passer. Si quelqu'un sait, veuillez 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. 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.

connuasilya
la source
3
org.hsqldb.util.DatabaseManagerSwing.main (nouvelle chaîne [] {"--url", URL, "--user", USERNAME, "--password", PASSWORD});
Petro Semeniuk
1

J'ai un problème avec la connexion à distance de la version 1.4.190 de H2 à inMemory (ainsi que dans le fichier) avec Connection is broken: "unexpected status 16843008"jusqu'à ce que ne pas rétrograder à 1.3.176. Voir Grails, l'accès au serveur H2 TCP se bloque

Grigory Kislin
la source
1

C'est plus un commentaire au précédent post de Thomas Mueller qu'une réponse, mais il n'a pas assez de réputation pour cela. Une autre façon d'obtenir la connexion si vous êtes Spring JDBC Template consiste à utiliser ce qui suit:

jdbcTemplate.getDataSource().getConnection();

Donc, en mode débogage, si vous ajoutez à la vue "Expressions" dans Eclipse, cela ouvrira le navigateur vous montrant la console H2:

org.h2.tools.Server.startWebServer(jdbcTemplate.getDataSource().getConnection());

Vue Expressions Eclipse

Console H2

Jacqueline Rodriguez
la source
0

Je ne sais pas pourquoi cela fonctionne bien sur vos machines, mais j'ai dû passer une journée pour que cela fonctionne.

Le serveur fonctionne avec Intellij Idea U via l'url "jdbc: h2: tcp: // localhost: 9092 / ~ / default".

"localhost: 8082" dans le navigateur fonctionne également très bien.

J'ai ajouté ceci dans le 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>
Eugène Kortov
la source
0

Qu'en est-il de visualiser (et également de modifier) ​​confortablement le contenu sur ODBC et MS-Access, Excel? Versions de logiciels ::

  • Version H2: 1.4.196
  • Version du pilote ODBC Win 10 Postgres: psqlodbc_09_03_0210
  • Pour le client ODBC Win7: win7_psqlodbc_09_00_0101-x64.msi

Serveur H2:

/*
For JDBC Clients to connect:
jdbc:h2:tcp://localhost:9092/trader;CIPHER=AES;IFEXISTS=TRUE;MVCC=true;LOCK_TIMEOUT=60000;CACHE_SIZE=131072;CACHE_TYPE=TQ
*/
public class DBStarter {
    public static final String BASEDIR = "/C:/Trader/db/";
    public static final String DB_URL = BASEDIR + "trader;CIPHER=AES;IFEXISTS=TRUE;MVCC=true;LOCK_TIMEOUT=10000;CACHE_SIZE=131072;CACHE_TYPE=TQ";

  static void startServer() throws SQLException {
        Server tcpServer = Server.createTcpServer(
                "-tcpPort", "9092",
                "-tcpAllowOthers",
                "-ifExists",
//                "-trace",
                "-baseDir", BASEDIR
        );
        tcpServer.start();
        System.out.println("H2 JDBC Server started:  " + tcpServer.getStatus());

        Server pgServer = Server.createPgServer(
                "-pgPort", "10022",
                "-pgAllowOthers",
                "-key", "traderdb", DB_URL
        );
        pgServer.start();
        System.out.println("H2 ODBC PGServer started: " + pgServer.getStatus());

    }
}   

Configuration de la source de données ODBC Windows10 qui peut être utilisée par n'importe quel client ODBC: Dans le champ Base de données, le nom donné dans le paramètre «-key» doit être utilisé. Configuration ODBC

YDZOGODOQ
la source