【问题标题】:Scala Doobie & Hikari CP transactor handlingScala Doobie & Hikari CP 事务处理
【发布时间】:2020-06-14 03:50:52
【问题描述】:

如果您这样做,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】:

    这不是您在应用程序中使用Resources 的方式。

    您确实在main 级别的某个地方执行.use,然后让需要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 的发布部分,因为它很容易搞砸,例如如果抛出异常,则不调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-13
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多