从单元测试连接时,HSQL 立即关闭连接

Posted

技术标签:

【中文标题】从单元测试连接时,HSQL 立即关闭连接【英文标题】:HSQL closed connection immediately when connecting from unit test 【发布时间】:2012-01-02 08:53:04 【问题描述】:

我正在尝试针对正在运行的本地 JBoss 5.1 实例创建一个自动集成测试,我需要对数据库进行断言。应用服务器在服务器模式下配置了 HSQL 数据源,以便可以通过 TCP 访问。

这些是配置的相关(我认为)部分:

<connection-url>jdbc:hsqldb:hsql://$jboss.bind.address:1701</connection-url>
<driver-class>org.hsqldb.jdbcDriver</driver-class>
<user-name>sa</user-name>
<password></password>
<mbean code="org.jboss.jdbc.HypersonicDatabase" 
     name="jboss:service=Hypersonic">
     <attribute name="Port">1701</attribute>        
     <attribute name="BindAddress">$jboss.bind.address</attribute>     
     <attribute name="Silent">true</attribute>
     <attribute name="Database">default</attribute>
     <attribute name="Trace">false</attribute>
     <attribute name="No_system_exit">true</attribute>
</mbean>

它的工作原理是部署的应用程序运行良好,而且我还能够使用“hsqldbclient”和 Eclipse“Data Source Explorer”等外部工具连接到数据库。

问题是,当我尝试从测试用例获取连接时,连接会立即关闭,并且出现“Broken Pipe”错误。

这是我尝试建立连接的方式:

DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:1701", "sa", "");

这是我在客户端遇到的错误:

Caused by: org.hsqldb.HsqlException: connection exception: connection failure: java.net.SocketException: Broken pipe
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.ClientConnection.execute(Unknown Source)
    at org.hsqldb.ClientConnection.<init>(Unknown Source)

这是我在服务器端遇到的错误:

09:46:04,132 ERROR [STDERR]    Exception in thread "HSQLDB Connection @fa3b82" 
09:46:04,133 ERROR [STDERR]    java.lang.NullPointerException
09:46:04,133 ERROR [STDERR]     at org.hsqldb.ServerConnection.close(Unknown Source)
09:46:04,133 ERROR [STDERR]     at org.hsqldb.ServerConnection.run(Unknown Source)
09:46:04,133 ERROR [STDERR]     at java.lang.Thread.run(Thread.java:662)

我无法解释正在发生的事情。看起来连接正在建立,然后服务器立即关闭,但连接为空,导致抛出空指针。请注意,这都在同一台机器上,我可以使用其他工具进行连接,但使用与上述相同的连接 URL。

如果有人对尝试什么有任何想法,我将不胜感激。

【问题讨论】:

【参考方案1】:

我在查看使用了哪些版本的 HSQLDB 后发现了问题(fredt 的回答给了我这个想法)。

由于某种原因,客户端使用 HSQLDDB 2.0,但 JBoss 5.1 附带 1.8。我将客户端更改为也使用 1.8,问题就消失了。真的很简单,但我被困了将近一天。

【讨论】:

【参考方案2】:

我还没有尝试过,但如果您的连接是在应用服务器中建立的,您也许可以直接连接到数据库:

DriverManager.getConnection("jdbc:hsqldb:file:default", "sa", "");

您可能需要使用默认数据库的完整路径。

NPE 可能是使用的 HSQLDB 版本中的错误。尝试将 hsqldb.jar 替换为更高版本,例如 HSQLDB 1.8.1.3。

【讨论】:

嗨,很遗憾,无法使用文件 url 进行连接,因为数据库已经被应用服务器锁定,这在某种程度上是有意义的。但是非常感谢您指出我正在研究使用的版本,因为这是问题所在!

以上是关于从单元测试连接时,HSQL 立即关闭连接的主要内容,如果未能解决你的问题,请参考以下文章

我需要 dispose() 在单元测试中吗? [复制]

mybatis 通过配置父类数据源连接和关闭数据,进行junit单元测试

无法从应用程序使用 hsqldb 连接,但单元测试工作

在 Laravel 中使用 MySQL 数据库连接运行多个单元测试时出错

避免在 Play 中打开未使用的数据库连接

Scala - 为使用数据库连接扩展特征/类的对象/单例编写单元测试