我们最近在生产环境中的应用程序中遇到了一个问题。我们在生产环境中更新了我们的应用程序版本,因为有更多的查询要转到DB。在任何其他查询的应用程序中没有进行任何更改。
有些日子,这些额外的查询没有发送,有些日子将这些额外的查询发送到DB。
我们启用了eclipselink jpa日志记录,发现某些天的entitymanager.find会导致对数据库的额外调用,在某些日子里,数据似乎从缓存中返回,而不是Db调用。
我假设这是eclipselink L2缓存,它保存这些数据,当缓存未命中时,db查询被触发。我在上述陈述中是否正确?
如果我的上述陈述是正确的,那么在某些日子为什么应用程序正在寻找的数据在缓存中丢失的原因是什么?我们还没有做任何额外的代码来清除任何缓存我们的知识?
此外,L2缓存数据究竟存在于何处?它会在堆内存中吗?垃圾收集对此L2缓存有什么影响?
答案 0 :(得分:0)
EclipseLink网站上有许多文档详细介绍了它的缓存及其工作原理。我建议您首先查看https://www.eclipse.org/eclipselink/documentation/2.4/concepts/cache001.htm和https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching/Configuring,然后询问您的具体问题,并且有很多原因导致某天某些内容可能在缓存中而非下一天,具体取决于设置。默认情况下,共享二级高速缓存使用软缓存和弱标识映射引用,因此应用程序不再引用的对象可以进行垃圾回收。