3

我使用 MYSQL 数据库和 Swing 应用程序框架和 javax.persistence 开发了一个相当大的 CRUD 应用程序。我的问题是我应该如何最好地管理我的事务给定 javax.persistence.Entitymanager?目前,我有一个由 Application 类持有的实体管理器实例。它被传递给所有请求页面,这些页面又使用它来持久化和合并实体。我在应用程序启动时启动事务,并在每次进行更改时提交(并重新启动)。它是否正确?或者我应该为每个组件/页面持有一个单独的实体管理器?我应该什么时候承诺?现在所有这些问题都出现了,因为我最近开始遇到以下类型的异常: java.sql.SQLException: Lock wait timeout exceeded; 尝试重新启动事务错误代码:

提前感谢您能给我的任何帮助!

4

1 回答 1

4

在应用程序启动时开始事务并不是最好的主意。事务应该尽可能短,因为每个事务都会锁定数据库。我的意思是,每次启动事务时,没有其他线程可以写入数据库。你做事的方式恰恰相反:你的数据库不仅仅在很短的时间内被锁定。这可能是您遇到错误的原因。

一般来说,推荐的交易管理方式如下:

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 类,您的实体管理器工厂只创建一次。这很好,因为创建它的计算成本很高。但是,一旦创建实体管理器的实例就非常便宜。这个简短的教程很好地解释了它。

于 2011-09-07T19:22:00.927 回答