查看H2或HSQLDB内存数据库的内容

97

有没有一种方法可以浏览H2或HSQLDB内存数据库的内容以供查看?例如,在Hibernate调试会话期间检查何时执行flush;或确保实例化DB的脚本给出了预期结果。

是否存在可以嵌入代码中以允许此操作的插件或库?

请在您针对其中一个具体回答时提到它们(H2或HSQLDB)。

注:H2和HSQLDB是两种不同的内存数据库。

这是否回答了您的问题?在调试时检查内存中的hsqldb - rogerdpack
11个回答

64
你可以在应用程序中运行H2 Web服务器,它将访问相同的内存数据库。您也可以使用任何通用的JDBC客户端(如SquirrelSQL)访问以服务器模式运行的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在同一进程中连接到数据库,或使用localhost:8082浏览foo_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>

顺便提一下,你应该仅依赖于断言而不是手动查看数据库内容。仅在故障排除时使用此功能。

请注意,如果您使用Spring测试框架,则不会看到正在运行的事务所做的更改,并且此事务将立即在测试后回滚。


3
我收到错误提示:"true" 是无效选项。-webAllowOthers 还需要传递参数吗?根据最新的 H2 代码,它不再需要传递任何参数。请参考这里的 "main" 方法:http://www.h2database.com/javadoc/org/h2/tools/Server.html - hshib
2
像 hman 提到的那样,最新版本不接受 "true" 参数,所以只需将其删除:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/> - Mike R
2
新版本遵循分离的参数约定:Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers") - Jor
10
在纯Java中,您需要删除"true"参数,并将参数分开,如下所示:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start(); - xnopre
3
使用Spring Boot,您只需在application.properties文件中设置"h2.console.enabled: true"和"h2.console.path: h2-console"即可。这将启用H2数据库的Web控制台,并将其路径设置为"/h2-console"。 - user2754985
显示剩余3条评论

35

对于H2数据库,如果您有一个数据库连接对象,在调试会话期间,您可以在代码中启动一个Web服务器。您可以将此行添加到您的代码中,或作为一个“监视表达式”(动态地)。

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

这个服务器工具会启动本地的web浏览器,让你可以访问数据库。


8
针对那些正在使用Spring Data的人,我给出以下评论:你可以通过以下方式从ApplicationContext获取连接: ((DataSource)context.getBean("dataSource")).getConnection()。 - Odysseus
这在 JUnit TestWatcher @Rule 中也非常棒。 - weberjn
3
在IntelliJ调试时,即使使用“evaluateExpression”启动它,它也能正常工作。(锁定其他监视器,直到停止) - borjab
我将 DataSource 实例自动装配到我的测试用例中,并添加了一个方法,其主体为 org.h2.tools.Server.startWebServer(dataSource.getConnection());。现在评估该方法会打开浏览器。请注意,这会导致执行暂停,直到您断开连接(浏览器左上角的图标)! - Tom

10

在H2中,我做的是:

编写代码,启动服务器,如下所示:

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

这会在本地的9092端口上启动服务器。

然后,在代码中,使用以下JDBC URL建立数据库连接:

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

在调试时,作为客户端检查数据库,我使用由H2提供的工具,它足够好用,只需要单独启动以下Java主程序即可

org.h2.tools.Console

这将启动一个带有应用程序的Web服务器在8082端口,并在localhost:8082上打开浏览器。

然后您可以输入前面的URL来查看数据库。


4

For HSQLDB, The following worked for me:

DatabaseManager.threadedDBM();

一旦我将它指向正确的内存数据库名称,它就会弹出带有我的表格和数据的GUI界面。

这基本上相当于新建一个DatabaseManager(非Swing类型),它会提示输入连接详细信息,并设置为--noexit

我也尝试了Swing版本,但它只有一个main,我不确定要传递哪些参数。如果有人知道,请在此发布。

仅因为我搜索了几个小时才找到正确的数据库名称:数据库名称就是您的数据源名称。因此,如果您有一个id = dataSource的数据源bean,请尝试使用URL jdbc:hsqldb:mem:dataSource。如果这行不通,请尝试testdb,这是默认值。


5
org.hsqldb.util.DatabaseManagerSwing.main(new String[] { "--url", URL, "--user", USERNAME, "--password", PASSWORD}); 这行代码的意思是调用 HSQLDB 数据库管理器界面,并传递数据库连接参数:URL、USERNAME 和 PASSWORD。 - Petro Semeniuk
以下是参数的解释:https://dev59.com/_nE85IYBdhLWcg3wmEtW#3076005 - rogerdpack

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

根据文档,您可以在任何JDBC连接中使用“管理器”,因此这也适用于H2 :) http://hsqldb.org/doc/2.0/util-guide/dbm-chapt.html - rogerdpack

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 />

3

这是一个 Play 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 <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
这更像是对之前Thomas Mueller的帖子的评论,而不是答案,但我没有足够的声望来发表评论。如果您正在使用Spring JDBC模板,则获取连接的另一种方法是使用以下内容:
jdbcTemplate.getDataSource().getConnection();

所以在调试模式下,如果您将“表达式”视图添加到Eclipse中,它将打开浏览器并显示H2控制台:

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

Eclipse 表达式视图

H2 控制台


完全拯救了我的一天。 - user1593165
或者使用org.h2.tools.Server.createWebServer("-trace").start()创建Web服务器,并使用Web浏览器连接到localhost:8082 - Gwaptiva

1
我遇到了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-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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接