如何在相对较大的应用程序中使用Entity Manager管理数据库事务?

我使用MYSQL数据库和Swing应用程序框架以及javax.persistence开发了一个相当大的CRUD应用程序。 我的问题是,鉴于javax.persistence.Entitymanager,我应该如何最好地管理我的交易? 目前,我有一个由Application类持有的实体管理器实例。 它被传递给所有请求页面,而这些页面又使用它来持久化并合并实体。 我在应用程序启动时启动一个事务,并在每次进行更改时提交(并重新启动)。 它是否正确? 或者我应该为每个组件/页面保持单独的实体管理器? 我什么时候应该承诺? 所有这些问题现在都出现了,因为我最近开始得到类型的exception: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类只能创建一次实体管理器工厂。 这很好,因为创建它在计算上很昂贵。 但是,一旦创建它,​​使实体管理器的实例非常便宜。 这个简短的教程很好地解释了它。