Java 具有多个服务器的JPA

Java 具有多个服务器的JPA,java,database,jpa,toplink,Java,Database,Jpa,Toplink,我目前正在从事一个项目,该项目使用JPA(Toplink,当前)作为其持久性。目前,我们只运行一个应用服务器,但为了冗余,我们希望添加一个负载平衡器和另一个应用服务器(随着应用服务器的增长,可能还会增加) 首先,我遇到了JPA缓存的问题。由于两个进程将更新同一个数据库,JPA缓存将返回缓存的值,而不是返回数据库。我看到了如何关闭它,数据库本身实现了一个缓存级别。关闭缓存是否完全是解决问题的方法?我看到了告诉JPA总是在查询级别从数据库获取信息的方法,但是在多服务器环境中,您似乎总是希望这样 除了

我目前正在从事一个项目,该项目使用JPA(Toplink,当前)作为其持久性。目前,我们只运行一个应用服务器,但为了冗余,我们希望添加一个负载平衡器和另一个应用服务器(随着应用服务器的增长,可能还会增加)

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

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


非常感谢。

如您所见,您可以禁用共享缓存,请参阅或

根据您的数据和需求,EclipseLink中还有其他可用选项

选项列表包括:

  • 禁用共享缓存

  • 启用缓存协调(请参阅)

  • 设置缓存失效超时(请参阅)

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

  • 研究EclipseLink与Oracle Coherence的Oracle TopLink集成,以提供分布式缓存

  • 另见


    没有完美的解决方案,使用的解决方案通常取决于数据/类,通常一个应用程序有一组只读类、读为主类和写为主类。就我个人而言,我会在1天超时的情况下为只读启用缓存,为读大部分启用缓存协调,并为写大部分禁用缓存。

    您指的是什么缓存?来自TopLink的东西(JPA1.0没有标准化二级缓存)?你能澄清一下吗?我在这里谈论的是会话缓存()。为什么在发布问题时不提供该链接?添加上下文或链接通常不会有什么坏处,特别是当一个问题是关于特定于提供商的功能而不是JPA的时候。你是对的,我应该包括这一点。我最近才开始使用JPA,并且只使用Toplink,所以我仍然倾向于将它们视为同一件事(尽管我知道它们不是)。