【发布时间】:2019-08-15 11:25:54
【问题描述】:
我正在使用 Kotlin 与 HikariCP 和 jOOQ 来查询我的数据库。我开始意识到这段代码按预期工作,获取行并随后关闭连接:
class CountriesService(private val datasource: DataSource) {
private val countries = Countries()
fun getCountries(): List<String> {
DSL.using(datasource, SQLDialect.POSTGRES_10)
.use { ctx ->
ctx.select(countries.CO_NAME)
.from(countries)
.orderBy(countries.CO_NAME)
.fetch()
return emptyList()
}
}
}
而如果我使用fetchResultSet(),则连接永远不会关闭并且池会干涸:
class CountriesService(private val datasource: DataSource) {
private val countries = Countries()
fun getCountries(): List<String> {
DSL.using(datasource, SQLDialect.POSTGRES_10)
.use { ctx ->
ctx.select(countries.CO_NAME)
.from(countries)
.orderBy(countries.CO_NAME)
.fetchResultSet()
return emptyList()
}
}
}
我已经看到 AbstractResultQuery#fetchResultSet() 委托给 fetchLazy() 方法,所以不确定它是否与此有关。
如果我自己获得连接而不是将其委托给DSLContext,那么它可以工作:
class CountriesService(private val datasource: DataSource) {
private val countries = Countries()
fun getCountries(): List<String> {
val conn = datasource.connection
conn.use {
DSL.using(it, SQLDialect.POSTGRES_10)
.select(countries.CO_NAME)
.from(countries)
.orderBy(countries.CO_NAME)
.fetchResultSet()
return emptyList()
}
}
}
这是我应该使用的最后一种方法吗?
【问题讨论】:
-
为什么首先要获取 JDBC
ResultSet?您的代码并未暗示这对您有用。还有,为什么每次都返回emptyList()? -
@LukasEder 好吧,是的,也许这不是最明确的例子,只是想快速显示我的问题,对此感到抱歉。我需要
ResultSet,因为那时我使用SimpleFlatMapper 生成具有多对多关系的结果,如本文arnaudroger.github.io/blog/2017/02/27/jooq-one-to-many.html 中所述,类似于MyClass.mapper.stream(rs).toList()(映射器位于MyClass 的伴随对象中)。让我更新一下问题。 -
嗯,也许,与其更新问题(因为我的回答仍然对其他人有用),你能问一个更完整的新问题吗?以下是一些指导方针:stackoverflow.com/help/mcve