如何创建一个线程安全的EntityManagerFactory?

Van*_*ran 7 java orm multithreading jpa

我正在开发一个需要做一些数据库操作的应用程序.

我为EntityManagerFactory创建了一个静态变量,并在应用程序调用的方法中对其进行了初始化

 if (emf == null){
                    emf = Persistence.createEntityManagerFactory("example");
                }

try {
            em = emf.createEntityManager();
        } catch (Exception ex) {
            logger.error(ex.getMessage());
        }
Run Code Online (Sandbox Code Playgroud)

这个线程安全吗?如果我在同步块中创建EntityManagerFactory,则等待线程数会增加并使应用程序崩溃.

我查看了文档,看看Persistence.createEntityManagerFactory是否是线程安全的,没有任何成功.

请指出正确的资源.

Pas*_*ent 11

"解决"这个问题的一种简单方法是使用辅助类(a la HibernateUtil)并EntityManagerFactory在静态初始化块中初始化.像这样的东西:

public class JpaUtil { 
    private static final EntityManagerFactory emf;

    static {
        try {
            factory = Persistence.createEntityManagerFactory("MyPu");
        } catch (Throwable ex) {
            logger.error("Initial SessionFactory creation failed", ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

   ...

}
Run Code Online (Sandbox Code Playgroud)

而"问题"已经消失.

  • 我经常得到的一个论点是,在静态块中使用代码会妨碍测试.我们严格遵循测试驱动开发.所以我需要一些更容易测试的东西. (2认同)