4

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

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

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

非常感谢。

4

1 回答 1

6

如您所见,您可以禁用共享缓存,请参阅http://wiki.eclipse.org/EclipseLink/Examples/JPA/Cachinghttp://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 天,为大部分读取启用缓存协调缓存,并为大部分写入禁用缓存。

于 2010-08-10T14:02:47.697 回答