Scala Doobie &Hikari CP事务处理程序

问题描述 投票:0回答:1

如果你这样做,HikariCP每次都会被初始化和关闭。有什么办法可以避免这种情况,并执行各种查询?

// Resource yielding a transactor configured with a bounded connect EC and an unbounded
// transaction EC. Everything will be closed and shut down cleanly after use.
  val transactor: Resource[IO, HikariTransactor[IO]] =
  for {
    ce <- ExecutionContexts.fixedThreadPool[IO](32) // our connect EC
    be <- Blocker[IO] // our blocking EC
    xa <- HikariTransactor.newHikariTransactor[IO](
      "org.h2.Driver", // driver classname
      "jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", // connect URL
      "sa", // username
      "", // password
      ce, // await connection here
      be // execute JDBC operations here
    )
  } yield xa

运行

transactor.use(sql"select 42".query[Int].unique.transact[IO]).unsafeRunSync()
scala hikaricp doobie
1个回答
1
投票

这不是你使用的方式 Resource的应用中。

你做 .use 某处 main 级,然后让你的整个代码需要 Transactor 获得该值的传递,例如

val actorSystemResource: Resource[IO, ActorSystem]
val transactorResource: Resource[IO, Transactor[IO]]

// initialize controllers, services, etc and create routes for them
def routes(actorSystem: ActorSystem, transactor: Transactor[IO]): Route

val resources = for {
  transactor <- transactorResource
  actorSystem, <- actorSystemResource
  route = routes(actorSystem, transactor)
} yield (transactor, actorSystem, route)

resources.use { case (_, actorSystem, route) =>
  implicit system = actorSystem

  IO.fromFuture {
    Http().bindAndHandle(route, "localhost", 8080)
  }
}

或者,你可以用 resource.allocated但这几乎肯定是个坏主意,因为这会导致代码永远不会运行发布部分的 Bracket 因为很容易出乱子,比如说如果抛出一些异常,就不调用它。

© www.soinside.com 2019 - 2024. All rights reserved.