当前位置: 首页 > 知识库问答 >
问题:

带应用引擎的EclipseLink JPA:缓存同步

钮兴安
2023-03-14

我有一个应用引擎项目,使用EclipseLink作为JPA持久性管理器,将数据持久化到云SQL实例中。

由于应用程序引擎(多实例环境)的性质,我们对如何在实例之间同步JPA缓存有一些担忧。

每个JPA实例在单个应用引擎实例中运行,因此不使用应用引擎的Memcache服务(否则,EclipseLink不“知道”什么是应用引擎Memcache或如何使用它)

下面是一个简单的场景示例

- Instance A read object 1: value="A"
- Instance B read object 1: value="A"

- Instance A write object 1: value="B"
- JPA cache of Instance A is evicted due to write operation

- Instance A read object 1: value="B" (the value is retrieved from the database because cache has been evicted after write operation)
- Instance B read object 1: value="A" (no write operation has been performed, the cache is still valid so the value has not been updated)

在四处搜索这种行为时,我发现了不同的文章讨论了这种行为[1][2][3][4]。

我引用:

除非数据库被其他应用程序直接修改,或者被集群环境中其他服务器上的同一应用程序修改

由于App Engine的性质,为此我们可以将其视为“集群环境中的其他服务器”,因此情况似乎就是这样。

当然,处理这个问题的正确方法应该是为JPA构建一个缓存层,该缓存层构建在App Engine memcache服务之上,但从我的搜索中,我了解到EclipseLink不允许开发自定义缓存层。我可以在EclipseLink和App Engine memcache之间搭建一个桥梁,但如果有合适的“挂钩”,我找不到任何参考。

从留档有几个关于如何处理的建议:

>

  • 禁用共享缓存:由于应用程序性能损失,这不是一个合适的选项

    使用分布式缓存(如Oracle TopLink Grid with Oracle Coherence):我想使用App Engine memcache服务,但据我所知,我们不能使用EclipseLink“钩子”

    使用缓存协调(同步缓存,如本例所述)提供的方法似乎不适用于App Engine环境

    对于如何正确处理这种缓存场景,是否有已知的解决方案?这里的场景非常清楚,当在实例内进行写操作时,需要“通知”所有现有的JPA缓存,以及收回它们自己的缓存。

    [1] https://wiki.eclipse.org/EclipseLink/Examples/JPA/CacheCoordination

    [2]http://www.eclipse.org/eclipselink/documentation/2.5/concepts/cache011.htm

    [3] https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Coordination

    [4] https://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching#Caching_in_Clustered_Environments

  • 共有1个答案

    薄高懿
    2023-03-14

    我查看了Eclipse Link(EL)源代码,看看是否有任何简单的方法可以扩展缓存协调机制以与GAE一起使用。

    EL默认支持JMS和RMI,并且缓存协调是围绕远程处理构建的,因此EL可以发送命令(org.eclipse.persistence.sessions.coordination.Command),这些命令针对AbstractSession在集群中的每个主机上执行

    我认为没有任何方法可以使用MemCache进行缓存,因为像MergeChangeSetCommand这样的命令总是在AbstractSession上运行。

    可以通过扩展org来构建自己的缓存协调协议。日食坚持不懈会议。协作TransportManager和设置eclipselink。隐藏物协作协议=com。实例MyTransportManager,但DiscoveryManager使用多播,这在云中通常不可用。如果您可以发现所有GAE实例(并将数据直接发送到每个节点),我认为有可能创建一个基于http的缓存协调解决方案。在AWS上,可以向负载平衡器询问节点列表,这是我们在需要使用Hazelcast进行节点内通信时绕过多播问题的方法。

     类似资料:
    • Google API客户端库 Google云存储客户端库 Google云存储API Google Cloud Storage JSON API Java客户端库 我仍然不知道每一个都是做什么的,我不知道如何在我的android客户端中实现云存储。 如果我使用云存储,为什么我需要应用引擎后端应用?我的后端不需要API,对吗?我可以使用Google Cloud Storage JSON API直接消耗

    • 问题内容: yihui给出了针对不同引擎使用cache选项的示例 https://github.com/yihui/knitr-examples/blob/master/023-engine- python.Rmd 我似乎无法使其适用于python。 以下作品 但这行不通 有人有主意吗? 问题答案: 块选项不会保存块中定义的除之外的所有语言变量。但是,这是保存打印输出的结果,因此,如果您计算需要花

    • 我正在寻找关于如何建立一个谷歌应用引擎项目的建议,该项目涉及多个模块,其中一个模块是GWT项目。我已经阅读了谷歌应用引擎模块文档(https://developers.google.com/appengine/docs/java/modules/)并在Stackoverflow上找到了一些帮助,比如本文使用appengine骨架原型发布GWT GAE应用程序引擎模块。然而,这涉及到很多东西,所以我

    • 我是谷歌应用引擎服务的新手。我有一个JavaMaven项目,其中一个模块运行在应用引擎flex上,另一个模块运行在应用引擎标准上。我正在为应用引擎Flex API使用JWT身份验证。我想从应用引擎标准向应用引擎Flex发出发布请求。验证服务的最佳方式应该是什么? 此外,我还有一个cron服务,它可以访问我用于某些后端内容的特定URL。如何验证请求是否仅来自Cron服务?

    • 我们有一个应用程序引擎应用程序,它将许多相对较大的文件写入谷歌云商店。这些文件是动态创建的CSV,因此我们使用Python的作为写入该缓冲区的接口。 通常,我们的流程如下所示: 据我们所知,不需要自己关闭。相反,只需要关闭上面的和。 我们在appengine的任务队列调用的

    • 在python上的GoogleAppEngine中,我遇到了以下错误:在服务了总共2个请求后,超过了128 MB的软私有内存限制,达到了157 MB。我尝试使用以下命令来解决这个问题。上下文=ndb。获取上下文()和上下文。设置缓存策略(False)。我把这个方法放在appengine\u配置中。py,也在应该处理请求的处理程序中。我想知道是否还有其他地方可以放置这个命令,或者我是否应该总共使用一