有没有办法浏览H2或HSQLDB内存数据库的内容以供查看?例如,在与Hibernate的调试会话期间,为了检查执行刷新的时间;或者确保实例化DB的脚本给出了预期的结果。
是否存在可以嵌入代码的插件或库,以便允许此操作?
请提及您正在谈论的是哪一个(H2或HSQLDB),以防您有一个特定于其中一个的答案。
答案 0 :(得分:54)
您可以在应用程序中运行H2 web server,它将访问相同的内存数据库。您还可以使用任何通用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 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>
顺便说一句,你应该只依赖于断言而不是手动查看数据库内容。仅用于故障排除。
N.B。如果您使用Spring测试框架,您将看不到正在运行的事务所做的更改,并且此事务将在测试后立即回滚。
答案 1 :(得分:27)
对于H2,如果您有数据库连接对象,则可以在调试会话期间start a web server within your code。您可以将此行添加到代码中,或者作为“监视表达式”(动态地)添加:
org.h2.tools.Server.startWebServer(conn);
服务器工具将在本地启动一个允许您访问数据库的Web浏览器。
答案 2 :(得分:8)
在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以查看数据库
答案 3 :(得分: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
答案 4 :(得分: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 />
答案 5 :(得分:2)
这是一个用于初始化H2 TCP和Web服务器的Play 2控制器:
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");
}
}
}
答案 6 :(得分:1)
对于HSQLDB,以下内容对我有用:
DatabaseManager.threadedDBM();
这会带来我的表格和数据。
我也尝试过Swing版本,但它只有main
,我不确定要传递的参数。如果有人知道,请在这里发帖。
仅仅因为我搜索了正确的数据库名称数小时:数据库的名称是数据源的名称。因此,如果您有一个id = dataSource的数据源bean,请尝试使用URL jdbc:hsqldb:mem:dataSource。如果这不起作用,请尝试默认的testdb。
答案 7 :(得分:1)
我在使用Connection is broken: "unexpected status 16843008"
的H2版本1.4.190与inMemory(以及文件)远程连接时遇到问题,直到不降级到1.3.176。见Grails accessing H2 TCP server hangs
答案 8 :(得分: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>
答案 9 :(得分:0)
这更多是对托马斯·穆勒(Thomas Mueller)以前的帖子的评论,而不是一个答案,但并没有获得足够的声誉。如果您是Spring JDBC模板,则获得连接的另一种方法是使用以下方法:
jdbcTemplate.getDataSource().getConnection();
因此,在调试模式下,如果您在Eclipse中添加到“表达式”视图,它将打开浏览器,向您显示H2控制台:
org.h2.tools.Server.startWebServer(jdbcTemplate.getDataSource().getConnection());
答案 10 :(得分:0)
通过ODBC和MS-Access,Excel舒适地查看(以及编辑)内容又如何呢? 软件版本::
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());
}
}
Windows10 ODBC数据源配置,可由任何ODBC客户端使用: 在“数据库”字段中,必须使用“ -key”参数中给出的名称。