[英]How should manage Database transactions using Entity Manager in a relatively large application?
我使用MYSQL數據庫和Swing應用程序框架以及javax.persistence開發了一個相當大的CRUD應用程序。 我的問題是,鑒於javax.persistence.Entitymanager,我應該如何最好地管理我的交易? 目前,我有一個由Application類持有的實體管理器實例。 它被傳遞給所有請求頁面,而這些頁面又使用它來持久化和合並實體。 我在應用程序啟動時啟動一個事務,並在每次更改時提交(並重新啟動)。 它是否正確? 或者我應該為每個組件/頁面保持單獨的實體管理器? 我什么時候應該承諾? 所有這些問題現在都出現了,因為我最近開始獲得類型的異常:java.sql.SQLException:超出鎖定等待超時; 嘗試重新啟動事務錯誤代碼:1205這讓我相信我在管理數據庫事務時做錯了什么....
在此先感謝您的幫助,您可以給我!
在應用程序啟動時啟動事務不是最好的主意。 事務應該盡可能短,因為每個事務都會鎖定數據庫。 我的意思是,每次啟動事務時,沒有其他線程可以寫入數據庫。 你正在做的事情恰恰相反:你的數據庫只是在很短的時間內才被鎖定。 這可能是您獲得錯誤的原因。
通常,管理事務的推薦方法如下:
EntityManager em = EMF.getEM();
em.getTransaction().begin();
// your persist, merge code goes here
em.getTransaction().commit();
em.close();
EMF類是這樣的:
public class EMF {
private static EntityManagerFactory emf;
static {
emf = Persistence.createEntityManagerFactory("MyEMF");
}
public static EntityManager getEM(){
return emf.createEntityManager();
}
}
這樣,您的事務只會在執行持久性代碼期間鎖定數據庫。 請注意,使用EMF類只能創建一次實體管理器工廠。 這很好,因為創建它的計算成本很高。 但是,一旦創建它,使實體管理器的實例非常便宜。 這個簡短的教程很好地解釋了它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.