我注意到在我的 Quartz 作业的执行之间重用了一个 Hibernate 会话(每个线程肯定有一个会话)。这会导致诸如“对象在不同的事务中更新”之类的错误(是的!)而且这种行为打破了基本的会话每个请求模式。我不知道这样一个会话实际存在多长时间 - 可能永远存在?
1)也许这种会话重用仍然正确?
2)我应该如何调整一些设置以强制为每个作业执行打开新会话?无需手动调用withNewSession()
...
例子:
class PersistentCat {
UUID unique
static transients = ['unique']
}
class MyJob {
def execute() {
def ssn = sessionFactory.currentSession
def tid = Thread.currentThread().id
def pfx = "thr:$tid, ssn:${ssn.hashCode()}"
def cat = PersistentCat.get(2265734)
if ( ! cat.unique) {
cat.unique = UUID.randomUUID()
println "$pfx - assigning ${cat.unique} to${cat.hashCode()}"
} else {
println "$pfx - having ${cat.unique} already for ${cat.hashCode()}"
}
}
}
(在现实生活中,我确实在我的工作中调用了交易服务,但事情保持不变。)
下面是输出(每行表示单个作业执行)。请注意第一个和最后一个作业执行:执行741211827
之间共享相同的会话,并且我们将相同的唯一持久对象***-7221e7a97f3d
附加到该会话。
thr:40, ssn:741211827 - assigning ***-7221e7a97f3d to 1067276977
thr:41, ssn:1711904876 - assigning ***-f60b9b9b8ae2 to 1905091715
thr:42, ssn:1793712482 - assigning ***-7d2a89712099 to 187890840
thr:43, ssn:1974717027 - assigning ***-aff9889f9147 to 1433286500
thr:44, ssn:873758823 - assigning ***-6fd87ccfbff5 to 1676979558
thr:45, ssn:1049618761 - assigning ***-d9f15c7429ec to 892993015
thr:46, ssn:1827346548 - assigning ***-9c92f4fea54f to 89176513
thr:47, ssn:212156716 - assigning ***-c5acc08ba7cc to 2016599572
thr:40, ssn:741211827 - having ***-7221e7a97f3d already for 1067276977
Grails 2.2.0,Quartz 插件 1.0-RC2