gpt4 book ai didi

postgresql - 如何用Doobie正确处理Hikari连接池

转载 作者:行者123 更新时间:2023-11-29 11:41:17 24 4
gpt4 key购买 nike

我一直在使用 doobie (cats) 从 scalatra 应用程序连接到 postgresql 数据库。最近我注意到该应用程序正在为每个事务创建一个新的连接池。我最终解决了它 - 见下文,但这种方法与 'managing connections' section of the book of doobie 中采用的方法完全不同。 ,我希望有人能确认它是否明智,或者是否有更好的方法来设置连接池。

这是我最初拥有的 - 这有效但会在每个连接上创建一个新的连接池:

import com.zaxxer.hikari.HikariDataSource
import doobie.hikari.hikaritransactor.HikariTransactor
import doobie.imports._

val pgTransactor = HikariTransactor[IOLite](
"org.postgresql.Driver",
s"jdbc:postgresql://${postgresDBHost}:${postgresDBPort}/${postgresDBName}",
postgresDBUser,
postgresDBPassword
)
// every query goes via this function
def doTransaction[A](update: ConnectionIO[A]): Option[A] = {
val io = for {
xa <- pgTransactor
res <- update.transact(xa) ensuring xa.shutdown
} yield res
io.unsafePerformIO
}

我最初的假设是问题是在每个请求上都ensuring xa.shutdown,但删除它会导致连接很快被用完,直到没有剩余。

这是解决问题的尝试 - 使我能够删除 ensuring xa.shutdown,但仍然导致连接池被反复打开和关闭:

val pgTransactor: HikariTransactor[IOLite] = HikariTransactor[IOLite](
"org.postgresql.Driver",
s"jdbc:postgresql://${postgresDBHost}:${postgresDBPort}/${postgresDBName}",
postgresDBUser,
postgresDBPassword
).unsafePerformIO

def doTransaction[A](update: ConnectionIO[A]): Option[A] = {
val io = update.transact(pgTransactor)
io.unsafePerformIO
}

最后,我通过创建一个 HikariDataSource 对象并将其传递给 HikariTransactor 构造函数来获得所需的行为:

val dataSource = new HikariDataSource()
dataSource.setJdbcUrl(s"jdbc:postgresql://${postgresDBHost}:${postgresDBPort}/${postgresDBName}")
dataSource.setUsername(postgresDBUser)
dataSource.setPassword(postgresDBPassword)

val pgTransactor: HikariTransactor[IOLite] = HikariTransactor[IOLite](dataSource)

def doTransaction[A](update: ConnectionIO[A], operationDescription: String): Option[A] = {
val io = update.transact(pgTransactor)
io.unsafePerformIO
}

最佳答案

你可以这样做:

val xa = HikariTransactor[IOLite](dataSource).unsafePerformIO

并将其传递到您的存储库。.transact 应用事务边界,如 Slick.transactionally。例如:

def interactWithDb = {
val q: ConnectionIO[Int] = sql"""..."""
q.transact(xa).unsafePerformIO
}

关于postgresql - 如何用Doobie正确处理Hikari连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47178508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com