我正在尝试实现一个优化锁定的通用解决方案。我想要实现的是在记录的版本更改时运行一段特定的代码。我把它作为一个 ExecuteListener
寻找的示例 DataChangedException
. 它被注册为 Spring Bean 。
class LockingListener : DefaultExecuteListener() {
override fun exception(ctx: ExecuteContext) {
val exception = ctx.exception()
if (exception is DataChangedException) {
ctx.exception(IllegalStateException("Accessed data has been altered mid-operation."))
}
}
}
@Configuration
class JooqConfig {
@Bean
fun lockingListenerProvider() = DefaultExecuteListenerProvider(LockingListener())
}
我设置了一个断点 org.jooq.impl.ExecuteListeners#get
它看起来像是在旁边被捡起来的 LoggerListener
以及 JooqExceptionTranslator
.
当我试着运行一个测试用例时, DataChangedException
不会被人发现 UpdateableRecord#update
我得到了下面的stacktrace,不是吗 IllegalStateException
就在眼前。
org.jooq.exception.DataChangedException: Database record has been changed or doesn't exist any longer
at org.jooq.impl.UpdatableRecordImpl.checkIfChanged(UpdatableRecordImpl.java:540)
at org.jooq.impl.UpdatableRecordImpl.storeMergeOrUpdate0(UpdatableRecordImpl.java:349)
at org.jooq.impl.UpdatableRecordImpl.storeUpdate0(UpdatableRecordImpl.java:241)
at org.jooq.impl.UpdatableRecordImpl.access$100(UpdatableRecordImpl.java:89)
at org.jooq.impl.UpdatableRecordImpl$2.operate(UpdatableRecordImpl.java:232)
at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:149)
at org.jooq.impl.UpdatableRecordImpl.storeUpdate(UpdatableRecordImpl.java:228)
at org.jooq.impl.UpdatableRecordImpl.update(UpdatableRecordImpl.java:165)
调试表明 LockingListener#exception
甚至没有进入。
1条答案
按热度按时间a11xaf1n1#
这个例外不属于
ExecuteListener
生命周期,即处理与JDBCAPI交互的生命周期。换句话说,它不是一个SQLException
,它发生在堆栈的更高位置。使用RecordListener.exception()
而是回调。