Kotliquery不关闭postgresql连接

我正在使用kotliquery jdbc框架的Kotlin

刚刚遇到问题。 我正在使用远程PostgreSQL数据库。 经过一些调用数据库,我得到以下错误Failure: too many clients already 。 这是由于100个连接idle造成的。

我试图创建1点,我必须做配置。 这就是我所说的BaseDAO。 该类的相关代码如下所示:

 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()) } } } 

而我的一个DAO的:

 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 } } 

查看Kotliquery的源代码后,我意识到session.connection.close()session.close甚至在使用using (因为它关闭了closable检索sessionclosable对象)时是不需要的。但是没有它们,我得到了同样的错误。 (必须重新启动postgresql数据库 – 100空闲连接)。

我想知道在我的代码中是否有错误,或者这是否是Kotliquery中的错误?

(也提交github问题#6,但认为社区可能会超过24人

似乎每次调用BaseDAO.getSession()都会创建新的HikariDataSource 。 这意味着每个Session都有自己的数据库连接池 。 为了解决这个问题,你需要维护HikariDataSource实例,例如:

 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) } } }