具有多个服务器的JPA

我目前正在开发一个使用JPA(Toplink,目前)持久化的项目。 目前,我们正在运行单个应用程序服务器,但是,为了实现冗余,我们希望添加一个负载均衡器和另一个应用程序服务器(并且可能随着它的增长而增加)。

首先,我遇到了JPA缓存问题。 由于两个进程将更新同一个数据库,因此JPA缓存将返回缓存的值而不是返回数据库。 我看到如何关闭它,数据库本身实现了一个级别的缓存。 完全关闭缓存的方式去这里? 我看到告诉JPA始终从查询级别的数据库获取的方法,但在多服务器环境中,似乎您总是希望这种情况发生。

除了这个特定问题,我对那些已经实现了具有多个应用程序服务器的JPA解决方案以及在实现过程中出现的问题(以及您提出的任何建议)的任何人感兴趣。

非常感谢。

如您所见,您可以禁用共享缓存,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching或http://wiki.eclipse.org/EclipseLink/FAQ/How_to_disable_the_shared_cache%3F

EclipseLink中还有其他选项可供选择,具体取决于您的数据和要求。

选项列表包括:

  1. 禁用共享缓存

  2. 启用缓存协调(请参阅http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/config/PersistenceUnitProperties.html#COORDINATION_PROTOCOL )

  3. 设置缓存失效超时(参见, http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/annotations/Cache.html#expiry%28%29 )

  4. 启用乐观锁定,这将确保无法更新任何陈旧对象,当对陈旧数据进行更新时,它将失败,并且EclipseLink将自动使缓存中的对象无效。

  5. 调查EclipseLink和Oracle Coherence的Oracle TopLink集成,以提供分布式缓存。

另见http://en.wikibooks.org/wiki/Java_Persistence/Caching#Caching_in_a_Cluster

没有完美的解决方案,通常使用的解决方案取决于数据/类,通常应用程序具有一组只读类,读取主要类和大多数类。 就个人而言,我会在1天的超时时间内为只读启用缓存,启用具有缓存协调的缓存,主要是读取,并且主要禁用写入的缓存。