H2またはHSQLDBインメモリデータベースのコンテンツを表示します
-
26-10-2019 - |
質問
表示するためにH2またはHSQLDBインメモリデータベースの内容を閲覧する方法はありますか?たとえば、フラッシュが実行された時期を確認するために、冬眠とのデバッグセッション中。または、DBをインスタンス化するスクリプトが期待される結果をもたらすことを確認する。
これを許可するためにコードに埋め込むことができるアドオンまたはライブラリが存在しますか?
あなたがそれらのいずれかに固有の答えを持っている場合、あなたが話しているもの(H2またはHSQLDB)について言及してください。
解決
H2を実行できます Webサーバー アプリケーション内で、同じインメモリデータベースにアクセスします。汎用JDBCクライアントを使用してサーバーモードで実行されているH2にアクセスすることもできます squirrelsql.
アップデート:
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データベースはコンソールでアクセスできません.
春を使用することもできます。
<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>
ところで、データベースの内容を手動で覗くのではなく、アサーションにのみ依存する必要があります。これをトラブルシューティングにのみ使用してください。
NBスプリングテストフレームワークを使用すると、実行中のトランザクションによる変更が表示されないため、このトランザクションはテスト直後にロールバックされます。
他のヒント
H2の場合、できます コード内でWebサーバーを起動します データベース接続オブジェクトがある場合は、デバッグセッション中。この行をコードに追加するか、「時計式」として(動的に)追加できます。
org.h2.tools.Server.startWebServer(conn);
サーバーツールは、データベースにアクセスできるWebブラウザーをローカルで起動します。
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が提供するものを使用します。これは十分です。
org.h2.tools.Console
これにより、8082にアプリを備えたWebサーバーが起動し、ブラウザでブラウザを起動します localhost:8082
そして、以前のURLを入力してDBを確認できます
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
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 />
これは、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");
}
}
}
HSQLDBの場合、以下は私のために働きました:
DatabaseManager.threadedDBM();
そして、これは私のテーブルとデータでGUIを育てました。
スイングバージョンも試しましたが、 main
, 、そして、私は合格する議論がわからなかった。誰かが知っている場合は、ここに投稿してください。
適切なデータベース名を検索したからといって、データベースの名前はデータソースの名前です。したがって、URL JDBC:HSQLDB:MEM:DataSourceで試してください。ID= DataSourceを備えたデータソースBeanがある場合。これが機能しない場合は、デフォルトであるtestDBを試してください。
私はH2バージョン1.4.190インメモリーへのリモート接続(およびファイル内)に問題があります Connection is broken: "unexpected status 16843008"
1.3.176にダウングレードしないまで。見る H2 TCPサーバーにアクセスするgrailはハングします
なぜあなたのマシンでうまく機能しているのかわかりませんが、それを手に入れるために一日を費やさなければなりませんでした。
サーバーは、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テンプレートの場合、接続を取得する別の方法は、以下を使用することです。
jdbcTemplate.getDataSource().getConnection();
したがって、デバッグモードでは、Eclipseで「式」ビューに追加すると、H2コンソールを表示するブラウザが開きます。
org.h2.tools.Server.startWebServer(jdbcTemplate.getDataSource().getConnection());