programing

비동기 트랜잭션으로 인해 Ilgal State Exception이 발생함

javaba 2022. 11. 5. 11:20
반응형

비동기 트랜잭션으로 인해 Ilgal State Exception이 발생함

내가 현재 해결해야 할 문제가 있다.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
  }
}

다음과 같이 사용합니다(dataSource가 주입됨).

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 부분이 있습니다.

의 실장을 참조해 주세요.withTransaction: https://github.com/slick/slick/blob/06ee4edade81633db10724a858f427deb563edfc/src/main/scala/scala/slick/jdbc/JdbcBackend.scala#L476

그것은 그 개인 var가inTransaction는 최신 상태이며 트랜잭션에 아직 존재하지 않는다고 생각되는 경우 작업 종료 시 자동 커밋을 true로 설정합니다.즉, 작성한 세션을 사용하여 작성한 코드가 호출됩니다.withTransaction트랜잭션을 커밋하고 자동 커밋을 다시 true로 리셋합니다.전화만 안 해주면 돼withTransaction그러나 예상치 못한 경우에 내부에서 호출하는 슬릭 오퍼레이션도 있습니다.예를 들어,++=벌크 인서트를 실행하기 위해 호출합니다.withTransaction작성한 트랜잭션을 커밋하고 그 후에 실행하는 모든 스테이트먼트가 자동 커밋됩니다.

언급URL : https://stackoverflow.com/questions/22169757/asynchronous-transaction-causes-illegalstateexception

반응형