我注意到在我的Quartz作业的执行之间重复使用了一个Hibernate会话(每个线程一个会话肯定)。这会导致像“对象在不同的事务中更新”这样的错误(是的!)同样这样的行为打破了基本的session-per-request模式。我不知道这样的会话实际存在多久 - 可能是永远的?...
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