93

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

它是否存在可以嵌入代码以允许这样做的插件或库?

请提及您正在谈论的是哪一个(H2 或 HSQLDB),以防您有特定于其中一个的答案。

4

11 回答 11

63

您可以在将访问相同内存数据库的应用程序中运行 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连接到您的数据库,或者foo_db使用localhost:8082. 记得关闭两台服务器。另请参阅:Console 无法访问内存模式下的 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 测试框架,您将看不到正在运行的事务所做的更改,并且该事务将在测试后立即回滚。

于 2011-09-05T14:27:30.760 回答
34

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

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

服务器工具将在本地启动允许您访问数据库的 Web 浏览器。

于 2011-09-06T05:09:11.400 回答
10

在 H2 中,对我有用的是:

我编码,启动服务器,如:

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

localhost这将在端口 9092上启动服务器。

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

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

在调试时,作为客户端检查数据库,我使用 H2 提供的数据库,这已经足够好了,要启动它,您只需要单独启动以下 java main

org.h2.tools.Console

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

然后你可以输入以前的URL来查看数据库

于 2013-05-03T14:51:11.173 回答
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
于 2011-09-05T16:08:40.300 回答
4

对于 HSQLDB,以下对我有用:

DatabaseManager.threadedDBM();

一旦我将它指向正确的名为 in-mem 的数据库,这就会用我的表和数据调出 GUI。

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

我也尝试了 Swing 版本,但它只有一个main,而且我不确定要通过的参数。如果有人知道,请在这里发帖。

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

于 2012-12-05T21:07:58.250 回答
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 />
于 2013-10-29T17:58:07.497 回答
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");
        }
    }
}
于 2015-05-19T12:50:56.030 回答
1

我在 H2 版本 1.4.190 远程连接到 inMemory(以及文件中)时遇到问题, Connection is broken: "unexpected status 16843008"直到不要降级到 1.3.176。请参阅Grails 访问 H2 TCP 服务器挂起

于 2015-11-15T11:37:52.787 回答
1

这更像是对先前 Thomas Mueller 帖子的评论,而不是答案,但没有得到足够的声誉。如果您是 Spring JDBC 模板,另一种获取连接的方法是使用以下内容:

jdbcTemplate.getDataSource().getConnection();

因此,在调试模式下,如果您添加到 Eclipse 中的“Expressions”视图,它将打开浏览器,向您显示 H2 控制台:

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

Eclipse 表达式视图

H2 控制台

于 2019-02-23T16:30:56.547 回答
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>
于 2018-03-09T09:22:54.077 回答
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 数据源配置:在数据库字段中,必须使用“-key”参数中给出的名称。 ODBC 配置

于 2020-03-27T09:28:38.180 回答