我在 ZIO 应用程序中使用 Doobie,有时会出现死锁(应用程序完全冻结)。如果我只在一个内核上运行我的应用程序,或者如果我达到与数据库的最大并行连接数,就会发生这种情况。
我的代码如下所示:
def mkTransactor(cfg: DatabaseConfig): RManaged[Blocking, Transactor[Task]] =
ZIO.runtime[Blocking].toManaged_.flatMap { implicit rt =>
val connectEC = rt.platform.executor.asEC
val transactEC = rt.environment.get.blockingExecutor.asEC
HikariTransactor
.fromHikariConfig[Task](
hikari(cfg),
connectEC,
Blocker.liftExecutionContext(transactEC)
)
.toManaged
}
private def hikari(cfg: DatabaseConfig): HikariConfig = {
val config = new com.zaxxer.hikari.HikariConfig
config.setJdbcUrl(cfg.url)
config.setSchema(cfg.schema)
config.setUsername(cfg.user)
config.setPassword(cfg.pass)
config
}
或者,我在 Hikari ( config.setLeakDetectionThreshold(10000L)
) 上设置了泄漏检测参数,我得到泄漏错误,这不是由于处理数据库查询所花费的时间。