[英]Inspect in memory hsqldb while debugging
我们在内存中使用 hdsqldb 来运行对数据库进行操作的 junit 测试。 在通过 spring 配置运行每个测试之前设置数据库。 一切正常。 现在,当测试失败时,可以方便地检查内存数据库中的值。 这可能吗? 如果是这样怎么办? 我们的网址是:
jdbc.url=jdbc:hsqldb:mem:testdb;sql.enforce_strict_size=true
每次测试后都会销毁数据库。 但是当调试器运行时,数据库也应该还活着。 我试过与 sqldb 数据库管理器连接。 这有效,但我没有看到任何表格或数据。 任何帮助表示高度赞赏!
在您的单元测试或@Before
/ setUp()
方法中,您可以添加以下行来启动 HSQL 数据库管理器:
org.hsqldb.util.DatabaseManager.main(new String[] {
"--url", "jdbc:hsqldb:mem:testdb", "--noexit"
});
或者对于具有“更多改进”的改进 Swing 版本(但功能大致相同)
org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
"--url", "jdbc:hsqldb:mem:testdb", "--noexit"
});
数据库管理器允许您在应用程序运行时检查架构并在实时内存数据库上运行 SQL 查询。
如果您想在特定行检查数据库的状态,请确保设置一个断点或以一种或另一种方式暂停执行。
HSQL 在内存中,所以当你说你正在与 SQLDB 数据库管理器连接时,你不是 - 而是连接到 SQLDB 数据库管理器内存空间中的另一个数据库,而不是连接到 SQLDB 数据库管理器内存空间中的数据库。单元测试。 这就是 SQLDB 数据库管理器中的数据库为空的原因。
您可以运行HSQL作为使用服务器org.hsqldb.Server
描述这里。
尽管org.hsqldb.Server
类通常用于启动一个单独的进程,但您可以在单元测试中实例化和配置它,这应该允许远程进程连接和查询数据库。
或者,您必须根据需要编写某种从单元测试中调用的转储功能。
顺便说一句,在单元测试中使用 HSQL 只是证明您的代码适用于 HSQL,这与实际数据库不同。 这意味着您可能会得到误报,反之亦然。 同样的事情可以通过模拟 API 或更好的方式来实现,将数据库测试保存为一些与真实数据库一起工作的体面的集成测试。
您还可以使用 [HSQLDB][1] 中包含的 DatabaseManagerSwing 类向其传递一个打开的连接,该类允许您查看连接所在事务中的数据库状态。
DatabaseManagerSwing manager = new DatabaseManagerSwing();
manager.main();
manager.connect(connection);
manager.start();
仅当数据库名称、用户名和密码未受影响(testdb、SA、空白密码)时,上述接受的答案才能完美运行。
对于自定义数据库名称、用户名和密码,您将收到以下异常
java.sql.SQLInvalidAuthroizationSpecException:无效的授权规范 - 未找到:SA
然后,您必须手动连接。
要直接连接到非“默认”数据库,请使用以下代码段
org.hsqldb.util.DatabaseManager.main(new String[] {
"--url", "jdbc:hsqldb:mem:yourdbname", "--noexit",
"--user", "dbusername", "--password", "dbpassword"
});
或者对于改进的 Swing 版本
org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
"--url", "jdbc:hsqldb:mem:yourdbname", "--noexit",
"--user", "dbusername", "--password", "dbpassword"
});
在执行上述代码段之前更新以下内容
数据库管理器冻结的问题可以通过在新线程中启动数据库管理器并休眠测试运行的线程来解决。
将此代码片段添加到您的测试中,您将能够在调试时检查数据库。 请记住将 database-url 更改为您的数据库。
Thread t = new Thread(new Runnable() {
@Override
public void run() {
org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
"--url", "jdbc:hsqldb:mem://localhost:9001", "--noexit"
});
}
});
t.start();
try {
Thread.sleep(10000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
这对我有用:
DatabaseManager.threadedDBM();
Thread.sleep(Long.MAX_VALUE);
来自https://stackoverflow.com/a/13732467/32453
它只是“非摆动”品种 DatabaseManager 并提示您输入 JDBC 连接字符串。 我不认为摇摆没有等效的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.