Scala 异步事务导致IllegalStateException
有一个问题我现在必须处理。 我正在尝试异步管理slick2.0事务。原因是我与之合作的未来 我编写了自己的方法,用slick异步处理会话:Scala 异步事务导致IllegalStateException,scala,playframework-2.0,slick,mariadb,hikaricp,Scala,Playframework 2.0,Slick,Mariadb,Hikaricp,有一个问题我现在必须处理。 我正在尝试异步管理slick2.0事务。原因是我与之合作的未来 我编写了自己的方法,用slick异步处理会话: def withAsyncTransaction[T](implicit block: Session => Future[T]): Future[T] = { val session = Database.forDataSource(dataSource).createSession() session.conn.setAutoCommit(
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
}
}
我是这样使用它的(数据源被注入):
堆栈跟踪:
The datasource has been shutdown.
java.lang.IllegalStateException: The datasource has been shutdown.
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:62)
该错误偶尔发生,不依赖于连接池。boneCP也有同样的问题。有人有主意吗
如蒙帮助,将不胜感激。
OliverKK我不确定到底是什么原因导致了您看到的错误,但我刚刚从经验中了解到,期货、滑头和交易的结合是令人头疼的。您编写的代码似乎应该可以正常工作,但slick的某些部分假定自动提交设置没有在背后更改 请参见带有事务的
的实现:
它假定它的私有var内部交易
是最新的,如果它认为它不在事务中,则在操作结束时将autocommit设置为true。这意味着,使用您创建的会话编写的调用withTransaction
的任何代码都将提交该事务并将自动提交重置为true。现在,只要您不使用Transaction调用,这似乎很好,但是有一些巧妙的操作在您可能不期望的情况下在内部调用它。例如,如果您使用++=
执行批量插入,它将调用with transaction
,并最终提交您创建的事务,之后执行的每个语句都将自动提交。这很奇怪。我不熟悉Slick,但似乎偶尔会在数据源本身而不是连接上调用close(),这可能吗?在阅读了Slick之后,在会话中使用Futures似乎是危险的,所以我不确定您尝试做的是可能的。请参阅文档,搜索警告的“escapes”一词。我建议你在光滑的论坛上提问。
The datasource has been shutdown.
java.lang.IllegalStateException: The datasource has been shutdown.
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:62)