web-dev-qa-db-ja.com

H2またはHSQLDBインメモリデータベースのコンテンツを表示する

H2またはHSQLDBインメモリデータベースのコンテンツを表示するために参照する方法はありますか?たとえば、Hibernateを使用したデバッグセッション中に、フラッシュがいつ実行されるかを確認します。または、DBをインスタンス化するスクリプトが期待される結果を提供することを確認します。

これを許可するためにコードに埋め込むことができるアドオンまたはライブラリが存在しますか?

あなたがそれらの1つに固有の答えを持っている場合、あなたが話しているもの(H2またはHSQLDB)に言及してください。

82
jplandrain

同じメモリ内データベースにアクセスするアプリケーション内でH2 Webサーバー を実行できます。 SquirrelSQL などの汎用JDBCクライアントを使用して、サーバーモードで実行されているH2にアクセスすることもできます。

更新:

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

これで、同じプロセス内でjdbc:h2:mem:foo_db URLを介してデータベースに接続したり、foo_dbを使用してlocalhost:8082データベースを参照したりできます。両方のサーバーを必ず閉じてください。参照: メモリモードのH2データベースにはコンソールからアクセスできません

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>

ところで、データベースの内容を手動で覗くのではなく、アサーションにのみ依存すべきです。これはトラブルシューティングにのみ使用してください。

N.B. Springテストフレームワークを使用する場合、実行中のトランザクションによる変更は表示されず、このトランザクションはテストの直後にロールバックされます。

55

H2の場合、データベース接続オブジェクトがある場合、デバッグセッション中に コード内でWebサーバーを起動 できます。この行をコードに追加するか、「監視式」として(動的に)追加できます。

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

サーバーツールは、Webブラウザをローカルで起動し、データベースにアクセスできるようにします。

29
Thomas Mueller

H2で私に役立つのは:

私はコーディングして、サーバーを次のように起動します:

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

これにより、localhostポート9092でサーバーが起動します。

次に、コードで、次のJDBC URLでDB接続を確立します。

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

デバッグ中に、DBを検査するクライアントとして、H2が提供するものを使用します。これは、それを起動するために、次のJava mainを個別に起動する必要があります。

org.h2.tools.Console

これにより、8082のアプリでWebサーバーが起動し、localhost:8082でブラウザーが起動します

そして、前のURLを入力してDBを見ることができます

8
dsantaolalla

HSQLDBには、いくつかの組み込みオプションがあります。

2つのGUIデータベースマネージャーと、データベースへのコマンドラインインターフェイスがあります。これらのクラスは次のとおりです。

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

上記のいずれかをアプリケーションから起動して、インメモリデータベースにアクセスできます。

JBossの例を以下に示します。

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

また、アプリケーションでサーバーを起動し、メモリ内データベースを指定することもできます。

org.hsqldb.Server
4
fredt

JConsoleで起動可能なJMX機能として公開できます。

@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:component-scan base-package="your.package.root" scoped-proxy="targetClass"/>
<context:annotation-config />
<context:mbean-server />
<context:mbean-export />
3
sibidiba

これは、H2 TCPおよびWebサーバーを初期化するPlay 2コントローラーです。

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");
        }
    }
}
3
Mariano Ruiz

HSQLDBの場合、次のことがうまくいきました。

DatabaseManager.threadedDBM();

これにより、テーブルとデータを含むGUIが表示されました。

Swingバージョンも試してみましたが、mainしかなく、渡す引数がわかりませんでした。誰でも知っている場合は、ここに投稿してください。

正しいデータベース名を何時間も検索したからといって、データベースの名前はデータソースの名前です。 id = dataSourceのデータソースBeanがある場合は、URL jdbc:hsqldb:mem:dataSourceを試してください。これが機能しない場合は、デフォルトのtestdbを試してください。

1
knownasilya

1.3.176にダウングレードしない限り、Connection is broken: "unexpected status 16843008"を使用したinMemory(およびファイル内)へのH2バージョン1.4.190リモート接続に問題があります。 H2にアクセスするGrails TCPサーバーがハングする を参照してください

1
GKislin

なぜあなたのマシンでうまく機能しているのかはわかりませんが、機能するためには1日を費やす必要がありました。

サーバーは、URL「jdbc:h2:tcp:// localhost:9092 /〜/ default」を介してIntellij Idea Uと連携します。

ブラウザの「localhost:8082」も正常に機能します。

これを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>

これは、答えではなく、以前のトーマス・ミューラーの投稿に対するコメントですが、それに対する十分な評判を得ていません。 Spring JDBC Templateである場合に接続を取得する別の方法は、次を使用することです。

jdbcTemplate.getDataSource().getConnection();

したがって、デバッグモードでは、Eclipseの「式」ビューに追加すると、ブラウザーが開き、H2コンソールが表示されます。

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

Eclipse Expressions View

H2コンソール