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