繁体   English   中英

调试时在内存中检查 hsqldb

[英]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 或更好的方式来实现,将数据库测试保存为一些与真实数据库一起工作的体面的集成测试。

运行你的单元测试到一个断点,然后在 Eclipse 的 Debug 透视图中,打开 Display 视图(Window、Show View、Display)并输入

    org.hsqldb.util.DatabaseManagerSwing.main(new String[] {
  "--url",  "jdbc:hsqldb:mem:testdb", "--noexit"
});

(根据dimdm 的帖子),突出显示它,右键单击并选择执行。

在此处输入图片说明

您还可以使用 [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"
});

在执行上述代码段之前更新以下内容

  • yourdbname - 用真实的数据库名称更新 yourdbname
  • dbusername - 使用您的数据库用户名更新 dbusername
  • dbpassword - 使用您的数据库密码更新 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();
}

如果您知道要在任何时候“检查”的表,您可以将其当前值输出到控制台。

https://stackoverflow.com/a/31887249/32453

您甚至可以在调试器中执行此调用...

这对我有用:

DatabaseManager.threadedDBM();
Thread.sleep(Long.MAX_VALUE);

来自https://stackoverflow.com/a/13732467/32453

它只是“非摆动”品种 DatabaseManager 并提示您输入 JDBC 连接字符串。 我不认为摇摆没有等效的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM