Kotliquery no cierra las conexiones postgresql

Estoy usando Kotlin con el marco jdbc kotliquery

Solo encontré un problema. Estoy usando una database remota de PostgreSQL. Después de llamar un poco a la database, recibo el siguiente error Failure: too many clients already . Que es causado por 100 conexiones que están idle .

Intento crear 1 punto donde tengo que hacer la configuration. Esto es lo que yo llamo mi BaseDAO. El código relevante para esa class se ve así:

 import com.zaxxer.hikari.HikariConfig import com.zaxxer.hikari.HikariDataSource import kotliquery.Session import kotliquery.sessionOf import javax.sql.DataSource class BaseDAO { companion object { var url: String = "jdbc:postgresql://server.local:5432/myDatabase" var user: String = "postgres" var pass: String = "postgres" val config: HikariConfig = HikariConfig() private fun dataSource(): DataSource { var hikariConfig: HikariConfig = HikariConfig(); hikariConfig.setDriverClassName("org.postgresql.Driver"); hikariConfig.setJdbcUrl(url); hikariConfig.setUsername(user); hikariConfig.setPassword(pass); hikariConfig.setMaximumPoolSize(5); hikariConfig.setConnectionTestQuery("SELECT 1"); hikariConfig.setPoolName("springHikariCP"); hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true"); hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250"); hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "2048"); hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true"); var dataSource: HikariDataSource = HikariDataSource(hikariConfig); return dataSource; } @JvmStatic fun getSession(): Session { return sessionOf(dataSource()) } } } 

Y uno de mis DAO's:

 class UserDAO { val toUser: (Row) -> User = { row -> User( row.int("id"), row.string("username"), row.string("usertype") ) } fun getAllUsers(): List<User> { var returnedList: List<User> = arrayOf<User>().toList() using(BaseDAO.getSession()) { session -> val allUsersQuery = queryOf("select * from quintor_user").map(toUser).asList returnedList = session.run(allUsersQuery) session.connection.close() session.close() } return returnedList } } 

Después de investigar el código fuente de Kotliquery, me di count de que la session.connection.close() y session.close ni siquiera serían necesarias cuando use using (ya que cierra un closable que es la session recuperada) pero sin ellos obtuve el mismo error . (tuvo que reiniciar la database postgresql – 100 conexiones inactivas).

Me preguntaba si hay un error en mi código o si esto es un error en Kotliquery.

(También envió el número 6 de github, pero calculó que la comunidad podría tener más de 24 personas

Parece que cada llamada a BaseDAO.getSession() crea un nuevo HikariDataSource . Esto significa que cada Session tiene efectivamente su propio grupo de conexiones de bases de datos . Para resolver eso, necesita mantener la instancia de HikariDataSource de HikariDataSource diferente, es decir:

 class BaseDAO { companion object { ... private val dataSource by lazy { var hikariConfig: HikariConfig = HikariConfig(); ... var dataSource: HikariDataSource = HikariDataSource(hikariConfig); dataSource; } @JvmStatic fun getSession(): Session { return sessionOf(dataSource) } } } 
  • TimeZone no muestra