我正在运行一些单元测试,但我看到一些奇怪的行为,关于连接在使用后没有被释放到池中(当测试次数达到池大小时,这不可避免地导致单元测试挂起)
为了演示,我创建了一个非常简单的单元测试:
@Before void setUp(){
sql = new Sql(getDataSource())
println getDataSource().getNumActive()
}
@After void tearDown(){
sql.close()
}
@Test void test1(){
println sql.rows("select 1")
}
@Test void test2(){
println sql.rows("select 1")
}
@Test void test3(){
println sql.rows("select 1")
}
@Test void test4(){
println sql.rows("select 1")
}
在我的setup方法中,我的getDataSource()方法只返回一个静态的,初始化的BasicDataSource(所以每次都是相同的数据源)。
我也在teardown方法中显式调用了我的Sql对象,尽管Groovy在其docs中说你在使用DataSource构造你的Sql对象时不需要
public Sql(javax.sql.DataSource dataSource)
Constructs an SQL instance using the given DataSource. Each operation will use a Connection from the DataSource pool and close it when the operation is completed putting it back into the pool.
但是,当我运行测试时,活动连接的数量会继续增加,如果我将最大池大小设置为2,那么它将在第二次测试后无限期地挂起。
有人可以建议为什么不返回连接吗?
感谢。
答案 0 :(得分:0)
好的,这是一个愚蠢的问题..
我没有注意到测试类正在扩展另一个在其中有重复@Before安装方法的类,所以显然在池中做了有趣的事情。删除它已解决了这个问题。