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


90

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

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

それらのいずれかに固有の答えがある場合に備えて、話しているのはどれか(H2またはHSQLDB)を述べてください。

回答:


59

同じインメモリデータベースにアクセスするアプリケーション内で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>

ところで、データベースのコンテンツを手動でピークするのではなく、アサーションのみに依存する必要があります。これはトラブルシューティングにのみ使用してください。

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


2
「true」は無効なオプションであるというエラーが発生しました。-webAllowOthersはパラメーターを取るために使用されましたか?最新のH2コードでは、パラメーターを使用しません。ここで「メイン」メソッドを見てください:h2database.com/javadoc/org/h2/tools/Server.html
hshib

1
:HMANが述べたように、最新バージョンでは、これだけそれを削除し、「真の」パラメータを受け入れていない<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
マイク・R

2
新しいバージョンは、別の引数の慣習に従う Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
JOR

7
純粋なJavaでは、あなたが「真」パラメータを削除し、このようなパラメータを分離する必要がありますServer.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre

2
Spring Bootを使用すると、application.propertiesファイルで「h2.console.enabled:true」と「h2.console.path:h2-console」を簡単に設定できます。
user2754985 2016年

31

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

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

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


4
Spring Dataを使用している人へのコメント-次の方法でApplicationContextから接続を取得できます:((DataSource)context.getBean( "dataSource"))。getConnection()
Odysseus

これは、JUnit TestWatcher @Ruleでもすばらしい
weberjn

3
デバッグ中にintelliJの「evaluateExpression」で起動しても機能します。(残りの時計を停止するまでロックします)
ボルジャブ2017

9

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が提供するDBを使用して起動します。これを起動するには、次のJavaメインを個別に起動するだけです。

org.h2.tools.Console

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

次に、以前のURLを入力してDBを表示できます


4

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

3

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

これは、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 <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");
        }
    }
}

2

HSQLDBの場合、以下が機能しました。

DatabaseManager.threadedDBM();

そして、これは私のテーブルとデータでGUIを表示しました。

Swingバージョンも試してみましたが、しかなく、main渡す引数がわかりませんでした。どなたかご存知の方はこちらに投稿してください。

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


3
org.hsqldb.util.DatabaseManagerSwing.main(new String [] {"--url"、URL、 "--user"、USERNAME、 "--password"、PASSWORD});
ペトロセメニウク2013


1

これは答えではなく、以前のThomas Muellerの投稿に対するコメントですが、十分な評判がありません。Spring JDBCテンプレートである場合に接続を取得する別の方法は、以下を使用することです。

jdbcTemplate.getDataSource().getConnection();

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

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

Eclipse式ビュー

H2コンソール


0

なぜあなたのマシンでうまく機能するのかは分かりませんが、機能させるために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>

0

ODBCとMS-Access、Excelでコンテンツを快適に表示(および編集)することについてはどうですか?ソフトウェアバージョン::

  • H2バージョン:1.4.196
  • Win 10 Postgres ODBCドライバーバージョン:psqlodbc_09_03_0210
  • Win7 ODBCクライアントの場合:win7_psqlodbc_09_00_0101-x64.msi

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());

    }
}   

任意のODBCクライアントで使用できるWindows10 ODBCデータソース構成:Databseフィールドでは、「-key」パラメーターで指定された名前を使用する必要があります。 ODBC構成

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.