2011-09-05 138 views
74

有沒有辦法瀏覽H2或HSQLDB內存數據庫的內容以供查看?例如,在與Hibernate進行調試會話期間,爲了檢查刷新何時執行;或者確保實例化數據庫的腳本能夠提供預期的結果。查看H2或HSQLDB內存數據庫的內容

它是否存在一個插件或一個庫,你可以嵌入你的代碼爲了讓這個?

請提一下你正在談論哪一個(H2或HSQLDB),以防你有一個答案是特定的。

回答

46

您可以在您的應用程序中運行H2 web server,該程序將訪問相同的內存數據庫。您還可以使用任何通用JDBC客戶端(如SquirrelSQL)訪問在服務器模式下運行的H2。

UPDATE:

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連接到數據庫或瀏覽使用localhost:8082foo_db數據庫。請記住關閉兩臺服務器。另見:H2 database in memory mode cannot be accessed by Console

你也可以使用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,你應該只依賴於斷言,而不是手動偷看數據庫內容。僅用於故障排除。

N.B.如果您使用Spring測試框架,則不會看到正在運行的事務所做的更改,並且此事務將在測試後立即回滾。

+2

我有錯誤 「真」 是無效的選項此。 -webAllowOthers是否曾經參數?使用最新的H2代碼,它不需要任何參數。看看這裏的「main」方法:http://www.h2database.com/javadoc/org/h2/tools/Server.html – hshib

+1

就像上面提到的那樣,最新版本不接受「true」參數,只是刪除它:'< constructor-arg value =「 - web,-webAllowOthers,-webPort,8082」/>' –

+1

新版本遵循單獨的參數約定 '服務器。createTcpServer(「 - tcpPort」,「9092」,「-tcpAllowOthers」)' 'Server.createWebServer(「 - webPort」,「8082」,「-tcpAllowOthers」)' – Jor

4

使用HSQLDB,您有幾個內置選項。

有兩個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 
24

對於H2,您可以start a web server within your code調試會話期間,如果你有一個數據庫連接對象。您可以將該行添加到您的代碼,或作爲「監視表達式」(動態):

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

服務器工具將啓動本地Web瀏覽器,使您可以訪問數據庫。

+2

對於那些使用Spring Data的人的評論 - 你可以從ApplicationContext以這種方式:((DataSource)context.getBean(「dataSource」))。getConnection() – Odysseus

+0

這在JUnit TestWatcher中也很棒@Rule – weberjn

+1

它甚至可以在調試時用intelliJ中的「evaluateExpression」賦予它。 (鎖定其餘的手錶直到停止) – borjab

1

對於HSQLDB,以下爲我工作:

DatabaseManager.threadedDBM(); 

這帶來了GUI與我的表和數據。

我也試過Swing版本,但它只有一個main,我不確定要傳遞的參數。如果有人知道,請在這裏發帖。

僅僅因爲我搜索了正確的數據庫名稱的小時:數據庫的名稱是您的數據源的名稱。因此,如果您有一個id = dataSource的數據源bean,請嘗試使用URL jdbc:hsqldb:mem:dataSource。如果這不起作用,請嘗試默認的testdb。

+2

org.hsqldb.util.DatabaseManagerSwing.main(new String [] {「--url」,URL,「--user」,USERNAME,「 - password」,PASSWORD}) ; –

7

在H2,什麼對我的工作原理是:

我的代碼,開始像服務器:

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

啓動服務器上localhost端口9092.

然後,在代碼中,建立在以下JDBC URL一個數據庫連接:

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

,而DEB ugging,作爲客戶端來檢查我用H2,這是不夠好,提供的一個數據庫,啓動它,你只需要啓動以下Java主要分別

org.h2.tools.Console 

這將啓動Web服務器與在8082應用程序,發動localhost:8082

一個瀏覽器,然後就可以進入以前的網址看到DB

3

可以公開爲JMX功能,通過可啓動的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); 
    } 
} 

XML方面:

<context:component-scan base-package="your.package.root" scoped-proxy="targetClass"/> 
<context:annotation-config /> 
<context:mbean-server /> 
<context:mbean-export /> 
+2

這實際上是一個很好的竅門! – jplandrain

2

這是一個播放2控制器初始化H2 TCP和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"); 
     } 
    } 
} 
1

我已經到inMemory H2版本1.4.190遠程連接(一個問題以及在文件中)與Connection is broken: "unexpected status 16843008"直到不​​降級到1.3.176。見Grails accessing H2 TCP server hangs

0

我不知道爲什麼它在你的機器上工作正常,但我不得不花一天時間才能使它工作。

服務器通過URL「jdbc:h2:tcp:// localhost:9092 /〜/ default」與Intellij Idea U一起工作。

「localhost:8082」在瀏覽器中工作正常。

我加入到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>