我有一个利用 JPA 的 Java Web 应用程序。数据库实例使用 jta-data-source
标记在 persistence.xml
文件中指定。
我想在同一个 (glassfish) 服务器上部署 Web 应用程序的第二个副本,但指向不同的数据库实例。
实现此目标的最佳方法是什么?我认为理想情况下,我想在 war 之外放置一个 persistence.xml
覆盖文件(类路径上的某个地方?)。我不确定将它放在哪里或如何以不会与我的其他实例混淆的方式定义它。我可以看到我们以这种方式 (SaaS) 托管了一些实例,我希望配置在部署的 war 之外,这样它就不会成为维护问题。出于安全原因,不能在客户端之间共享数据库实例。
我相信这不是我们小组的独特问题。其他人用来解决此问题的最佳做法或解决方案是什么?
最佳答案
更新:
http://docs.jboss.org/hibernate/stable/entitymanager/reference/en/html/configuration.html
不确定这是否可以在应用程序服务器中设置,但我会试一试。唯一让我担心的是范围的管理。容器沿着事务边界管理范围
//inject entity manager
@Inject("mySpecialEntityManager")
EntityManager em;
//then mark the actual factory method in the factory bean with
@Produces("mySpecialEntityManager")
但是如何管理范围是个问题
2.2.2。自举
JPA 规范定义了一个 Bootstrap 来访问 EntityManagerFactory 和 EntityManager。引导类是 javax.persistence.Persistence,例如
map configOverrides = new HashMap();
configOverrides.put("hibernate.hbm2ddl.auto", "create-drop");
EntityManagerFactory programmaticEmf =
Persistence.createEntityManagerFactory("manager1", configOverrides);
第一个版本等同于带有空 map 的第二个版本。 map 版本是一组优先于 persistence.xml 文件中定义的任何属性的覆盖。所有在第 2.2.1 节“打包”中定义的属性都可以传递给 createEntityManagerFactory 方法,还有一些额外的属性:
*
javax.persistence.provider to define the provider class used
*
javax.persistence.transactionType to define the transaction type used (either JTA or RESOURCE_LOCAL)
*
javax.persistence.jtaDataSource to define the JTA datasource name in JNDI
*
javax.persistence.nonJtaDataSource to define the non JTA datasource name in JNDI
*
javax.persistence.lock.timeout pessimistic lock timeout in milliseconds (Integer or String)
*
javax.persistence.query.timeout query timeout in milliseconds (Integer or String)
*
javax.persistence.sharedCache.mode corresponds to the share-cache-mode element defined in Section 2.2.1, “Packaging”.
关于java - 如何在 persistence.xml 中找到 "parameterize"JPA 数据库实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2998820/