有没有一种方法可以浏览H2或HSQLDB内存数据库的内容以供查看?例如,在Hibernate调试会话期间检查何时执行flush;或确保实例化DB的脚本给出了预期结果。
是否存在可以嵌入代码中以允许此操作的插件或库?
请在您针对其中一个具体回答时提到它们(H2或HSQLDB)。
注:H2和HSQLDB是两种不同的内存数据库。有没有一种方法可以浏览H2或HSQLDB内存数据库的内容以供查看?例如,在Hibernate调试会话期间检查何时执行flush;或确保实例化DB的脚本给出了预期结果。
是否存在可以嵌入代码中以允许此操作的插件或库?
请在您针对其中一个具体回答时提到它们(H2或HSQLDB)。
注:H2和HSQLDB是两种不同的内存数据库。更新:
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。<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测试框架,则不会看到正在运行的事务所做的更改,并且此事务将立即在测试后回滚。
<constructor-arg value="-web,-webAllowOthers,-webPort,8082"/>
。 - Mike RServer.createTcpServer("-tcpPort" ,"9092", "-tcpAllowOthers")
Server.createWebServer("-webPort", "8082", "-tcpAllowOthers")
- JorServer.createWebServer("-web", "-webAllowOthers", "-webPort", "8082").start();
- xnopre对于H2数据库,如果您有一个数据库连接对象,在调试会话期间,您可以在代码中启动一个Web服务器。您可以将此行添加到您的代码中,或作为一个“监视表达式”(动态地)。
org.h2.tools.Server.startWebServer(conn);
这个服务器工具会启动本地的web浏览器,让你可以访问数据库。
DataSource
实例自动装配到我的测试用例中,并添加了一个方法,其主体为 org.h2.tools.Server.startWebServer(dataSource.getConnection());
。现在评估该方法会打开浏览器。请注意,这会导致执行暂停,直到您断开连接(浏览器左上角的图标)! - Tom在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来查看数据库。
For HSQLDB, The following worked for me:
DatabaseManager.threadedDBM();
一旦我将它指向正确的内存数据库名称,它就会弹出带有我的表格和数据的GUI界面。
这基本上相当于新建一个DatabaseManager
(非Swing类型),它会提示输入连接详细信息,并设置为--noexit
。
我也尝试了Swing版本,但它只有一个main
,我不确定要传递哪些参数。如果有人知道,请在此发布。
仅因为我搜索了几个小时才找到正确的数据库名称:数据库名称就是您的数据源名称。因此,如果您有一个id = dataSource的数据源bean,请尝试使用URL jdbc:hsqldb:mem:dataSource。如果这行不通,请尝试testdb,这是默认值。
使用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");
}
}
}
jdbcTemplate.getDataSource().getConnection();
所以在调试模式下,如果您将“表达式”视图添加到Eclipse中,它将打开浏览器并显示H2控制台:
org.h2.tools.Server.startWebServer(jdbcTemplate.getDataSource().getConnection());
我不知道为什么你的机器可以正常工作,但我花了一天时间才让它正常运行。
服务器通过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>