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

2024-04-14

我使用 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(使用前将#替换为@)

在相对较大的应用程序中应该如何使用实体管理器管理数据库事务? 的相关文章

随机推荐