如何在一个相对较大的应用程序中使用实体管理器管理数据库事务



我使用MYSQL数据库和Swing application框架以及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您的实体管理器工厂只创建一次。这很好,因为创建它的计算成本很高。但是,一旦创建了实体管理器实例,创建实体管理器实例的成本就非常低。这个简短的教程很好地解释了它。

相关内容

  • 没有找到相关文章

最新更新