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

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

请提及您在谈论哪一个(H2或HSQLDB),以防您有一个针对其中一个的答案。

有帮助吗?

解决方案

您可以运行H2 网络服务器 在您的应用程序中,将访问相同的内存数据库。您还可以使用任何通用JDBC客户端访问在服务器模式下运行的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数据库.

您也可以使用弹簧:

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

顺便说一句,您只能依靠断言,而不应手动窥视数据库内容。仅将其用于故障排除。

NB如果使用春季测试框架,您将不会看到运行事务的更改,并且该交易将在测试后立即回滚。

其他提示

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

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

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

在H2中,对我有用的是:

我代码,启动服务器,例如:

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

那启动了服务器 localhost 港口9092。

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

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

在调试时,作为检查DB的客户,我使用了H2提供的DB,这足以启动它,您只需要单独启动以下Java Main

org.h2.tools.Console

这将在8082上使用应用程序启动Web服务器,在On上启动浏览器 localhost:8082

然后您可以输入以前的URL查看DB

使用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

您可以将其视为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 />

这是一个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");
        }
    }
}

对于HSQLDB,以下对我有用:

DatabaseManager.threadedDBM();

这用我的桌子和数据提高了GUI。

我也尝试了摇摆版本,但只有一个 main, ,我不确定要通过的论点。如果有人知道,请在此处发布。

仅仅因为我搜索了数小时的数据库名称:数据库的名称就是您的数据源名称。因此,请尝试使用URL JDBC:HSQLDB:MEM:DATASOURCE,如果您的数据源bean具有ID = DataSource。如果这不起作用,请尝试testDB,这是默认值。

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

我不知道为什么它在您的机器上正常工作,但是我不得不花一天的时间才能使它起作用。

该服务器通过URL与Intellij Idea U一起使用“ JDBC:H2:TCP:// localhost:9092/〜/default”。

浏览器ALSE中的“ 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>

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

jdbcTemplate.getDataSource().getConnection();

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

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

Eclipse表达式视图

H2控制台

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top