Я использую 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()
}
}
}
Это последний подход, который я должен использовать?