我目前正在开发一个项目,该项目使用 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 中还有其他可用选项。
选项列表包括:
禁用共享缓存
设置缓存失效超时(参见 http://www.eclipse.org/eclipselink/api/2.1/org/eclipse/persistence/annotations/Cache.html#expiry%28%29)
启用乐观锁定,这将确保无法更新任何陈旧对象,当对陈旧数据进行更新时它将失败,并且 EclipseLink 会自动使缓存中的对象失效。
研究 EclipseLink 和 Oracle Coherence 的 Oracle TopLink 集成以提供分布式缓存。
另请参阅,http://en.wikibooks.org/wiki/Java_Persistence/Caching#Caching_in_a_Cluster
没有完美的解决方案,通常使用的解决方案取决于数据/类,通常一个应用程序有一组只读类、读为主类和写为主类。就我个人而言,我会为只读启用缓存 1 天超时,为主要读取启用缓存协调缓存,并为主要写入禁用缓存。
关于java - 具有多个服务器的 JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3444449/