簡體   English   中英

如何在相對較大的應用程序中使用Entity Manager管理數據庫事務?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM