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


89

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

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

请说出您要谈论的是哪一个(H2或HSQLDB),以防您对其中之一有特定的答案。

Answers:


58

您可以在应用程序中运行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。记住要关闭两个服务器。另请参阅:控制台无法访问处于内存模式的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测试框架,则不会看到正在运行的事务所做的更改,并且该事务将在测试后立即回滚。


2
我收到错误消息,“ true”是无效选项。-webAllowOthers是否曾经使用过参数?使用最新的H2代码,它不需要任何参数。在这里查看“主要”方法:h2database.com/javadoc/org/h2/tools/Server.html
hshib 2013年

1
就像提到的hman一样,最新版本不接受“ true”参数,因此请将其删除:<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
Mike R

2
新版本遵循单独的参数约定 Server.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers") Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
约旦

7
在纯Java中,您必须删除“ true”参数,并像这样分隔参数:Server.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
xnopre

2
使用Spring Boot,您可以在application.properties文件中简单地设置“ h2.console.enabled:true”和“ h2.console.path:h2-console”。
user2754985'6

31

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

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

服务器工具将在本地启动Web浏览器,使您可以访问数据库。


4
为正在使用Spring Data的用户提供注释-您可以通过这种方式从ApplicationContext获得连接:((DataSource)context.getBean(“ dataSource”))。getConnection()
Odysseus

这在JUnit TestWatcher @Rule中也很不错
weberjn

3
如果在调试时在intelliJ中使用“ evaluateExpression”对它进行调试,它甚至可以工作。(将其余
手表

9

在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服务器,在上启动浏览器。 localhost:8082

然后您可以输入上一个URL来查看数据库


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

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

对于HSQLDB,以下对我有用:

DatabaseManager.threadedDBM();

这就用我的表和数据启动了GUI。

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

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


3
org.hsqldb.util.DatabaseManagerSwing.main(new String [] {“ --url”,URL,“ --user”,USERNAME,“ --password”,PASSWORD});
Petro Semeniuk


1

这更多是对托马斯·穆勒(Thomas Mueller)以前的帖子的评论,而不是一个答案,但并没有为此赢得足够的声誉。如果您是Spring JDBC模板,则获得连接的另一种方法是使用以下命令:

jdbcTemplate.getDataSource().getConnection();

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

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

Eclipse表达式视图

H2控制台


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>

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配置

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.