【发布时间】:2014-03-04 10:46:26
【问题描述】:
我目前必须处理一个问题。 我正在尝试异步管理 slick2.0 事务。原因是我使用的期货。
我编写了自己的方法来使用 slick 异步处理会话:
def withAsyncTransaction[T](implicit block: Session => Future[T]): Future[T] = {
val session = Database.forDataSource(dataSource).createSession()
session.conn.setAutoCommit(false)
block(session).recover {
case e: Exception =>
session.conn.rollback()
session.conn.close()
throw e
}.map { v =>
session.conn.commit()
session.conn.close()
v
}
}
我是这样使用的(数据源被注入):
withAsyncTransaction { implicit session =>
... CRUD
}
堆栈跟踪:
The datasource has been shutdown.
java.lang.IllegalStateException: The datasource has been shutdown.
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:62)
错误是偶尔发生的,它不依赖于连接池。 boneCP 也有同样的问题。有人有想法吗?
我们将不胜感激。 奥利弗KK
【问题讨论】:
-
这很奇怪。我对 Slick 不熟悉,但似乎偶尔会在 DataSource 本身而不是连接上调用 close(),这可能吗?
-
在阅读了 Slick 之后,似乎使用带有会话的 Futures 是危险的,所以我不确定你想要做什么是可能的。请参阅文档here,搜索单词“escapes”以获取警告。我建议在 Slick 论坛上提问。
标签: scala playframework-2.0 slick mariadb hikaricp