Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 异步事务导致IllegalStateException_Scala_Playframework 2.0_Slick_Mariadb_Hikaricp - Fatal编程技术网

Scala 异步事务导致IllegalStateException

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(

有一个问题我现在必须处理。 我正在尝试异步管理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
  }
}
我是这样使用它的(数据源被注入):

堆栈跟踪:

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)