2011-09-05 142 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>