是不是Grails的工作重用了每个线程的Hibernate会话?

时间:2013-08-23 14:31:01

标签: hibernate grails

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

0 个答案:

没有答案