【问题标题】:JPA with Multiple Servers具有多个服务器的 JPA
【发布时间】:2011-03-27 13:04:58
【问题描述】:

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

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

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

非常感谢。

【问题讨论】:

  • 你指的是什么缓存? TopLink 的东西(JPA 1.0 没有标准化 L2 缓存)?你能澄清一下吗?
  • 我在这里谈论的是会话缓存 (weblogs.java.net/blog/guruwons/archive/2006/09/…)。
  • 为什么在发布问题时没有提供该链接?添加上下文或链接通常不会受到伤害,尤其是当问题是关于提供者特定功能而不是 JPA 时。
  • 你是对的,我应该把它包括在内。我最近才开始使用 JPA,并且只使用 Toplink,所以我仍然倾向于将它们视为同一事物(尽管我知道它们不是)。

标签: java database jpa toplink


【解决方案1】:

如您所见,您可以禁用共享缓存,请参阅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 天超时,启用缓存与缓存协调以用于读取为主,并禁用缓存用于大部分写入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-12-26
    • 2013-07-31
    • 1970-01-01
    • 2020-12-26
    相关资源
    最近更新 更多