1

我注意到在我的 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

4

0 回答 0