【发布时间】:2019-08-15 14:15:38
【问题描述】:
我正在使用 Kotlin 与 HikariCP 和 jOOQ 来查询我的数据库。我开始意识到这段代码按预期工作,获取行并随后关闭连接:
class CountriesService(private val datasource: DataSource) {
private val countries = Countries()
fun getCountries(): List<Country> {
DSL.using(datasource, SQLDialect.POSTGRES_10)
.use { ctx ->
return ctx.select(...)
.from(...)
.orderBy(...)
.fetch(Country.mapper) // val mapper: (CountriesRecord) -> Country = {...}
}
}
}
在将多对多关系添加到Country 后,此映射器不再适用,因此我想获得ResultSet 并使用 SimpleFlatMapper 生成具有此关系的对象(如 this link 中所述),但是使用fetchResultSet() 连接永远不会关闭并且池会干涸:
class CountriesService(private val datasource: DataSource) {
private val countries = Countries()
fun getCountries(): List<Country> {
DSL.using(datasource, SQLDialect.POSTGRES_10)
.use { ctx ->
val rs = ctx.select(...)
.from(...)
.orderBy(...)
.fetchResultSet()
return Country.mapper.stream(rs).toList() // val mapper = JdbcMapperFactory.newInstance()...
}
}
}
我已经看到 AbstractResultQuery#fetchResultSet() 委托给 fetchLazy() 方法,所以不确定它是否与此有关。
如果我自己获得连接而不是将其委托给DSLContext,那么它可以工作:
class CountriesService(private val datasource: DataSource) {
private val countries = Countries()
fun getCountries(): List<Country> {
val conn = datasource.connection
conn.use {
val rs = DSL.using(it, SQLDialect.POSTGRES_10)
.select(...)
.from(...)
.orderBy(...)
.fetchResultSet()
return Country.mapper.stream(rs).toList() // val mapper = JdbcMapperFactory.newInstance()...
}
}
}
这是我应该使用的最后一种方法吗?
【问题讨论】: