Question

Est-il possible de parcourir le contenu d'un H2 ou d'une base de données HSQLDB en mémoire pour l'affichage? Par exemple, lors d'une session de débogage avec Hibernate afin de vérifier si la chasse est exécuté; ou pour vous assurer que le script qui instancie le DB 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?

S'il vous plaît, mention que l'on vous parlez (H2 ou HSQLDB) dans le cas où vous avez une réponse spécifique à l'un d'entre eux.

Était-ce utile?

La solution

Vous pouvez exécuter H2 serveur web dans votre application qui accédera au même in- la base de données de la mémoire. Vous pouvez également accéder au H2 en cours d'exécution en mode serveur en utilisant un 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 une URL de jdbc:h2:mem:foo_db dans le même processus ou parcourir la base de données à l'aide foo_db localhost:8082. Rappelez-vous de fermer les deux serveurs. Voir aussi:. base de données H2 en mode mémoire ne peut pas être 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 devez compter sur des affirmations et non sur le contenu manuel jeter un oeil base de données. A utiliser uniquement pour le dépannage.

N.B.. si vous utilisez framework de test Spring vous ne verrez pas les modifications apportées par une transaction en cours d'exécution et cette opération sera annulée immédiatement après le test.

Autres conseils

Pour H2, vous pouvez démarrer un serveur Web dans votre code lors d'une mise au point session si vous avez un objet de connexion de base de données. Vous pouvez ajouter cette ligne à votre code, ou comme une « montre l'expression » (dynamique):

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

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

Dans H2, ce qui fonctionne pour moi:

Code I, à partir du serveur comme:

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

qui démarre le serveur sur le port de localhost 9092.

Ensuite, dans le code, établir 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 le DB-je utiliser celui fourni par H2, ce qui est assez bon, pour le lancer il vous suffit de lancer séparément le principal 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 puis 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 bases de données de l'interface graphique et une interface de ligne de commande à 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 commencer à l'un des plus haut de votre application et accéder aux bases de données en mémoire.

Un exemple avec JBoss est donnée ici:

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

Vous pouvez également démarrer un serveur avec votre application, pointant à une base de données en mémoire.

org.hsqldb.Server

Vous pouvez l'exposer comme une caractéristique JMX, amorçable 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 />

Ceci est un jeu 2 contrôleur pour initialiser le H2 TCP et serveurs 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 <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 l'interface graphique avec mes tableaux et des données.

J'ai aussi essayé la version Swing, mais il n'y avait qu'un main, et je ne savais pas des arguments à passer. Si quelqu'un sait, s'il vous plaît poster ici.

Juste parce que je cherchais pendant des heures pour le nom de base de données droite: Le nom de la base de données est le nom de votre source de données. Donc, essayez avec l'URL jdbc: hsqldb: mem: dataSource si vous avez un grain de 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 la version H2 1.4.190 de connexion à distance à enMémoire (ainsi que dans le fichier) avec Connection is broken: "unexpected status 16843008" jusqu'à ne pas revenir à la version 1.3.176. Voir accès bloque serveur TCP H2

Je ne sais pas pourquoi il fonctionne bien sur des machines de la vôtre, mais je devais passer une journée afin de l'obtenir fonctionne.

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

"localhost: 8082". Dans le navigateur ALSE fonctionne bien

J'ajouté dans le répartiteur-mvc-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>

Ceci est plus un commentaire à poste plutôt que de Thomas Mueller précédent une réponse, mais n'ont pas assez réputation pour elle. Une autre façon d'obtenir la connexion si vous êtes Spring JDBC modèle est en utilisant les éléments suivants:

jdbcTemplate.getDataSource().getConnection();

Donc en mode débogage si vous ajoutez à la vue « Expressions » dans Eclipse il ouvrira le navigateur que vous montrant le H2 Console:

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

Eclipse Expressions Voir

H2 Console

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top