dbUnit问题:java.sql.SQLException:Closed语句

时间:2009-10-21 14:45:23

标签: java oracle dbunit

我对dbUnit有一个奇怪的问题。 我使用dbUnit 2.4.4,java 1.6,Spring(作为数据库连接池),Oracle 9为我的项目进行了大约50次单元测试。 对于其中一些(当我运行整套测试时),我得到了这样的例外:

Closed Statement
[junit] junit.framework.AssertionFailedError: Closed Statement
[junit]     at com.myproj.DataAccess.Internal.BaseDAOTest.importToDb(Unknown Source)
[junit]     at com.myproj.DataAccess.Internal.MyDAOTest.testGetBuyClientOrders(Unknown Source)
[junit]     at org.eclipse.ant.internal.ui.antsupport.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
[junit]     at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.run(InternalAntRunner.java:423)
[junit]     at org.eclipse.ant.internal.ui.antsupport.InternalAntRunner.main(InternalAntRunner.java:137)

importToDb方法通过dbUnit的DatabaseOperation.REFRESH.execute方法将测试数据从XML文件加载到数据库,并在所有测试中使用它。 如果我单独运行这些测试,那么它们就没有问题。 你有什么想法?谢谢!

2 个答案:

答案 0 :(得分:1)

我猜你的一些测试会在清理时关闭数据库连接。下一个测试尝试再次使用此连接进行导入并失败。

答案 1 :(得分:1)

当我遇到这种情况时,我们已明确配置连接缓存以使用两个属性来阻止持久连接:

AbandonedConnectionTimeout
InactivityTimeout

See Oracle's docs here regarding timeout properties

事实证明,查询+处理时间只是跳过两个属性组合的尖端(AbandonedConnectionTimeout + InactivityTimeout<查询时间+结果集处理时间)。

要解决此问题,您可以提高超时限制,也可以通过将超时设置为0(默认值)来删除超时