Kotliquery 不会关闭 postgresql 连接
Kotliquery doesn't close postgresql connections
我在 kotliquery jdbc 框架中使用 Kotlin
刚才运行出了问题。我正在使用远程 PostgreSQL 数据库。稍微调用数据库后,我收到以下错误 Failure: too many clients already
。这是由于 100 个连接 idle
.
我正在尝试创建 1 个必须进行配置的点。这就是我所说的 BaseDAO。 class 的相关代码如下所示:
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
检索 session
是。)但没有它们我得到了同样的错误。 (必须重新启动 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)
}
}
}
我在 kotliquery jdbc 框架中使用 Kotlin
刚才运行出了问题。我正在使用远程 PostgreSQL 数据库。稍微调用数据库后,我收到以下错误 Failure: too many clients already
。这是由于 100 个连接 idle
.
我正在尝试创建 1 个必须进行配置的点。这就是我所说的 BaseDAO。 class 的相关代码如下所示:
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
检索 session
是。)但没有它们我得到了同样的错误。 (必须重新启动 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)
}
}
}