2012-03-24 90 views
3

可以說我有三份工作當​​前正在運行,其中兩個是相同的......所以:做工作共享EntityManagers - 玩!框架

CrawlJob job1 = new CrawlJob(); 
CrawlJob job2 = new CrawlJob(); 
CurrentJob job3 = new CurrentJob(); 
job1.now() 
job2.now() 
job3.now() 

如果我這樣做在JOB1如下:

JPA.em().flush(); 
JPA.em().clear(); 

威爾也脫離一切job2和job3當前正在處理的實體?這意味着如果我在job2/job3中查看數據庫中的實體/模型對象,那麼job2/job3很可能會因爲對象剛剛脫離會話而中斷?

同樣,可以說我做JOB1如下:

long id = 123 
User user1 = new User(id); 
user1.save(); 

然後在作業2或作業3我做的:

User user2 = User.findById(id); 

將用戶2等於「空」或者等於「 USER1" ?這意味着,即使user1尚未刷新/提交到數據庫,job2或job3是否能夠通過Id查找它?

我認爲這兩個問題都是在於喬布斯(無論他們是否是同一個工作實例或不同的工作)共享EntityManagers,因此.em()。flush(),.em()。 clear()或.em()。getTransaction()。commit()或Model.save()會同時影響所有作業?

回答

3

作業啓動他們自己的jpa事務,並且實體在事務完成之前不會實際持久化。

因此,job2不會看到job1所做的更改,除非job2在job2加載實體時完成。

如果你想提交,同時jobs1數據仍然在運行,你可以在JOB1提交事務,並開始像一個新問題:

JPA.em().getTransaction().commit(); 
    JPA.em().getTransaction().begin(); 
    JPA.em().flush(); 
    JPA.em().clear(); 
+0

比方說JOB1和作業2(同一作業的2個實例)在稱爲processQueue()的'doJob()'中調用相同的方法。因此,如果在'processQueue(){}'我做'JPA.em()。getTransaction',你說一個不同的交易將被返回,取決於job1或job2是否稱爲processQueue?同樣,這聽起來像你所說的,在job1中執行'JPA.em()。clear'將不會影響job2中當前可能連接的實體。在你提供的例子中也有 – HelpMeStackOverflowMyOnlyHope 2012-03-25 13:36:14

+0

,你爲什麼在JPA.em().getTransaction()。commit()之後做JPA.em()。flush()? commit()不會與數據庫刷新/同步所有數據已經​​可以寫出來嗎? – HelpMeStackOverflowMyOnlyHope 2012-03-25 13:37:45

+0

感謝您的答覆,我有很多需要立即保存的實體。所以我把這段代碼放入一個無效名稱「saveEntities」中,並從任何需要更新的地方調用它。 – dreampowder 2012-11-21 11:34:53