you*_*ans 5 hibernate jpa pgpool spring-data-jpa kotlin
我在主线程中插入一个实体,然后在另一个线程中尝试modifiedAt通过 Spring JPA 存储库的 JPA 查询读取该插入实体的字段 ()。
interface SettlementRepository : JpaRepository<Settlement, Long> {
/**
* Fetches the state of a settlement.
*/
@Query("SELECT s.modifiedAt FROM Settlement s WHERE s.id = :id")
fun findModifiedAtById(id: Long): Instant
}
/* ... */
val transactionTemplate = TransactionTemplate(transactionManager)
val settlements: List<Settlement> = transactionTemplate.execute {
amounts.map {
settlementRepository.save(Settlement(...))
}
}!!
val executorService = Executors.newFixedThreadPool(4)
settlements.forEach {
executorService.execute {
val lastModified = settlementRepository.findModifiedAtById(it.id)
// But sometimes EmptyResultDataAccessException throws!
}
}
Run Code Online (Sandbox Code Playgroud)
插入是在事务中完成的TransactionTemplate,并且必须在数据库(PostgreSQL)中持久化和刷新,但有时(并非总是)EmptyResultDataAccessException抛出异常。
我的代码有什么问题吗?
注意:我已经禁用了 hibernate 的 2 级缓存。
注2:我们使用pgpool。
堆栈跟踪:
org.springframework.dao.EmptyResultDataAccessException: Result must not be null!
at org.springframework.data.repository.core.support.MethodInvocationValidator.invoke(MethodInvocationValidator.java:102) ~[spring-data-commons-2.2.0.RELEASE.jar!/:2.2.0.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.0.RELEASE.jar!/:5.2.0.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.0.RELEASE.jar!/:5.2.0.RELEASE]
at com.sun.proxy.$Proxy210.findModifiedAtById(Unknown Source) ~[na:na]
at com.github.yns.service.settlement.SimpleSettlementService.notModified(SimpleSettlementService.kt:484) ~[classes!/:0.0.1]
at com.github.yns.service.settlement.SimpleSettlementService.access$notModified(SimpleSettlementService.kt:74) ~[classes!/:0.0.1]
at com.github.yns.service.settlement.SimpleSettlementService$lockAndHandle$1.invoke(SimpleSettlementService.kt:466) ~[classes!/:0.0.1]
at com.github.yns.service.settlement.SimpleSettlementService$lockAndHandle$1.invoke(SimpleSettlementService.kt:74) ~[classes!/:0.0.1]
at com.github.yns.service.lock.LockKt.withLock(Lock.kt:52) ~[classes!/:0.0.1]
at com.github.yns.service.lock.LockKt.withLock$default(Lock.kt:43) ~[classes!/:0.0.1]
at com.github.yns.service.settlement.SimpleSettlementService.lockAndHandle(SimpleSettlementService.kt:465) ~[classes!/:0.0.1]
at com.github.yns.service.settlement.SimpleSettlementService.access$lockAndHandle(SimpleSettlementService.kt:74) ~[classes!/:0.0.1]
at com.github.yns.service.settlement.SimpleSettlementService$submitSettlement$1.run(SimpleSettlementService.kt:216) ~[classes!/:0.0.1]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) ~[na:na]
at java.base/java.lang.Thread.run(Unknown Source) ~[na:na]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
476 次 |
| 最近记录: |