我使用 MYSQL 数据库和 Swing 应用程序框架以及 javax.persistence 开发了一个相当大的 CRUD 应用程序。
我的问题是,在给定 javax.persistence.Entitymanager 的情况下,我应该如何最好地管理我的事务?
目前,我有一个由应用程序类持有的实体管理器实例。它被传递到所有请求页面,这些页面又使用它来保存和合并实体。我在应用程序启动时启动一个事务,并在每次进行更改时提交(并重新启动)。
它是否正确?或者我应该为每个组件/页面保留一个单独的实体管理器?
我应该什么时候承诺?
所有这些问题现在都出现了,因为我最近开始收到以下类型的异常:
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 类,您的实体管理器工厂仅创建一次。这很好,因为创建它的计算成本很高。然而,一旦创建,创建实体管理器的实例就非常便宜。这简短教程 http://www.vogella.de/articles/JavaPersistenceAPI/article.html很好地解释了这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)