비동기 트랜잭션으로 인해 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
'programing' 카테고리의 다른 글
MySQLdb 모듈 'Mysqlclient 또는 MySQL-python을 설치했습니까?' 로드 중 오류가 발생했습니다. (0) | 2022.11.05 |
---|---|
Python 사전의 고유 키 수 계산 (0) | 2022.11.05 |
InnoDB: redo 로그가 참조하므로 공백 ID가 26146인 데이터 파일 '.catalog_category_product_index_store1.ibd'를 무시합니다. (0) | 2022.11.05 |
다중 열 기본 키의 NULL 값 (0) | 2022.11.05 |
변수를 기본값으로 설정하는 최선의 방법(예: Perl ||, |= ) (0) | 2022.11.05 |