【问题标题】:Initialize a entity manager for scale in JAX-RS为 JAX-RS 中的规模初始化实体管理器
【发布时间】:2014-09-15 10:19:34
【问题描述】:

我正在使用部署在 heroku 中的 JAX-RS RESTful 服务。此服务仅检索信息或插入数据库。每次启动线程时,我都会执行以下代码来创建实体管理器:

@PostConstruct
public void init() {
    try {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("PersistenceUnit", System.getProperties());
        //InitialContext context = new InitialContext();
        entityManager = emf.createEntityManager();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

我认为这段代码使我的应用无法扩展。有人知道初始化实体管理器的其他方法吗?

pd:我在 heroku 中使用了一个 jetty 嵌入式服务器。

谢谢!

【问题讨论】:

    标签: java database jpa jax-rs entitymanager


    【解决方案1】:

    您的 EntityManagerFactory 应该只初始化一次并重复使用,因为它的创建成本很高。 EntityManagerFactory 也是线程安全的。您可以制作 EntityManagerFactory 的静态实例(例如通过创建一个单例类来存储它)。然后,您可以在需要创建 EntityManager 实例时调用 getInstance 方法

    单例示例:

    public class Emf {
    
      private static Emf theInstance = null;
      private  EntityManagerFactory entityManagerFactory = null;
    
      private Emf() {
          try {
               entityManagerFactory = Persistence.createEntityManagerFactory("PersistenceUnit", System.getProperties());
               //InitialContext context = new InitialContext();
              } catch (Exception e) {
                  // TODO Auto-generated catch block
                e.printStackTrace();
               }
        }
    
      public static synchronized Emf getInstance() {
          if (theInstance == null) {
            theInstance = new Emf();
         }
          return theInstance;
       }
    
      public EntityManagerFactory getFactory() {
      return entityManagerFactory;
    }
    

    }

    这样称呼它:

    @PostConstruct
    public void init() {
       try {
          entityManager = Emf.getInstance().getFactory().createEntityManager();
      } catch (Exception e) {
                // TODO Auto-generated catch block
          e.printStackTrace();
      }
    }
    

    【讨论】:

    • 你能用一个简单的例子解释一下吗?
    • @user3700763 不是单例的最佳示例,但用于演示目的很简单 - 如果您想要更好的示例,请告诉我
    • 当然!如果你有更好的例子,请放在这里!
    • 当然!如果你有更好的例子,请放在这里!
    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多