如果你这样做,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()
这不是你使用的方式 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
因为很容易出乱子,比如说如果抛出一些异常,就不调用它。