Postgresql 科特林+;JUnit+;集成测试postgres:泄漏的连接

Postgresql 科特林+;JUnit+;集成测试postgres:泄漏的连接,postgresql,junit,kotlin,integration-testing,Postgresql,Junit,Kotlin,Integration Testing,我建立了一个测试类,运行13个集成测试。所有测试都涉及模式中的1个数据库、1个模式和3个表。设置测试类是为了使用@BeforeClass创建测试数据库,并使用@AfterClass删除测试数据库。在每个测试的设置阶段,我迁移模式并用人工数据填充表。然后在tearDown阶段I删除模式。在每个测试中,我对测试数据库运行测试逻辑: classmytest{ 伴星{ private val helper=MyHelper() @BeforeClass@JvmStatic fun createTestD

我建立了一个测试类,运行13个集成测试。所有测试都涉及模式中的1个数据库、1个模式和3个表。设置测试类是为了使用
@BeforeClass
创建测试数据库,并使用
@AfterClass
删除测试数据库。在每个测试的
设置
阶段,我迁移模式并用人工数据填充表。然后在
tearDown
阶段I删除模式。在每个测试中,我对测试数据库运行测试逻辑:

classmytest{
伴星{
private val helper=MyHelper()
@BeforeClass@JvmStatic
fun createTestDatabase(){
helper.createTestDatabase()
}
@AfterClass@JvmStatic
fun removeTestDatabase(){
helper.deleteTestDatabase()
}
}
@以前
趣味设置(){
//迁移架构并用人工数据填充表
helper.migrate()
helper.populate()
}
@之后
有趣的撕裂{
//删除模式
helper.removeSchema()
}
@Test MyFirstTest(){
//用人工数据填充表格
…//测试逻辑
}
...
}
数据库操作都是在
MyHelper
类中实现的。特别是,我在
MyHelper
中有一个函数执行查询字符串:

类MyHelper{
受保护的val POSTGRES\u USER=“POSTGRES”
受保护的val POSTGRES_HOST=“localhost”
受保护的val POSTGRES_端口=5432
受保护的val POSTGRES\u测试\u数据\u数据库=“我的数据库\u测试”
受保护的val POSTGRES\u测试\u数据\u模式=“我的模式”
受保护的val POSTGRES\u默认值\u数据库=“POSTGRES”
受保护的val POSTGRES\u DEFAULT\u SCHEMA=“POSTGRES”
受保护的val graphDataTables=列表(“我的表1”、“我的表2”、“我的表3”)
val databases=listOf(POSTGRES_默认_数据库、POSTGRES_测试_数据_数据库)
val dataSources=databases.associateBy({it},{getDataSource(it)})
fun getDataSource(数据库:字符串):PGSimpleDataSource{
val ds=PGSimpleDataSource()
val url=“jdbc:postgresql://$POSTGRES\u主机:$POSTGRES\u端口/$database”
ds.setUrl(url)
ds.setUser(POSTGRES\u用户)
返回ds
}
fun executeQuery(sqlQuery:String,
database:String=this.POSTGRES\u DEFAULT\u数据库,
schema:String=this.POSTGRES\u DEFAULT\u schema
):单位{
val ds=数据源[数据库]!!
ds.currentSchema=schema
ds.connection.use{
it.createStatement().use{
it.execute(sqlQuery)
}
}
}
...
}
函数
MyHelper.populate()
使用
executeQuery
函数将数据插入表中

我的问题是,我似乎有许多未关闭的连接(泄漏的连接)。如果我将测试数保持在10以下,那么所有测试都会顺利通过。当我通过10级考试时,对于11级及以上的考试,我会出现如下错误:

Nov 09, 2017 11:31:55 AM org.postgresql.Driver connect
SEVERE: Connection error: 
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already
    at org.postgresql.Driver$ConnectThread.getResult(Driver.java:401)
    at org.postgresql.Driver.connect(Driver.java:259)
    ...
对于10号之后运行的测试。日志中的最后一个堆栈指向函数
executeQuery
中的
ds.connection.use{

但是,如果我将
helper.createTestDatabase()
移出伴随对象,并将其放入
MyTest
的init块中,如下所示:

classmytest{
伴星{
private val helper=MyHelper()
}
初始化{
helper.createTestDatabase()
}
...
}
然后,即使我的测试的#超过10,我也不会得到任何错误。我看到的问题是,现在我在我的postgres docker容器中创建了一个测试数据库,它在我完成集成测试后仍然存在。我不知道现在如何调用
removestdatabase

我在调试模式下运行我的测试,在第十次测试的中间停止,然后用

select * from pg_stat_activity;

我可以看到在第一个场景中有许多空闲连接(几乎100个)。在第二个场景中,在第十个测试的中间只有10个空闲连接(当然,我希望空闲连接的数目是0个)。。我的理解是,我的默认postgres设置是

max_connections
设置为100。这就是为什么我在第一个场景中有10个以上的测试时出现错误的原因。但是我不知道如何创建空闲连接。

我的假设是,您的助手方法是保持连接的方法。但您没有共享它们。如果我把它包括在内,问题就太长了。但正如我在问题中所说的,助手中的每个方法都通过传递查询字符串来调用
executeQuery
方法。这是我获得数据库连接的唯一地方。