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

标签 java mysql persistence entitymanager swing-app-framework

我使用 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 类,您的实体管理器工厂仅创建一次。这很好,因为创建它的计算量很大。但是,一旦创建实体管理器的实例就非常便宜。这short tutorial解释得相当好。

关于java - 在一个相对较大的应用程序中应该如何使用实体管理器来管理数据库事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7329873/

相关文章:

c# - 轻量级灵活的数据持久化选项

java - 重新附加父实体时删除子实体

c# - 如何在我的 WP7 应用程序中序列化委托(delegate)

java - 递归程序来加减一个数

java - AssertJ 断言抛出异常或结果

mysql - 删除级联MySQL

php: mysql_insert_id() 问题

java - Jpedal 图书馆免费吗?

java - 玩! 2.1 更新 Play! 后表格被破坏! 2.0应用程序

mysql - 导入维基百科数据库 : create table structure