当前位置: 首页 > 面试题库 >

禁用JPA中的缓存(eclipselink)

通奕
2023-03-14
问题内容

我想使用JPA(eclipselink)从数据库中获取数据。该数据库由许多其他来源更改,因此我想针对我执行的每个查找返回数据库。我已经阅读了许多有关禁用缓存的文章,但这似乎不起作用。有任何想法吗?

我正在尝试执行以下代码:

        EntityManagerFactory entityManagerFactory =  Persistence.createEntityManagerFactory("default");
        EntityManager em = entityManagerFactory.createEntityManager();

        MyLocation one = em.createNamedQuery("MyLocation.findMyLoc").getResultList().get(0);

        MyLocation two = em.createNamedQuery("MyLocation.findMyLoc").getResultList().get(0);

        System.out.println(one==two);

一==二是正确的,而我希望它是错误的。

我尝试将以下每个/所有内容添加到我的persistence.xml中

<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="None"/>

我也尝试过将@Cache注释添加到实体本身:

@Cache(
  type=CacheType.NONE, // Cache nothing
  expiry=0,
  alwaysRefresh=true
)

我误会了吗?


问题答案:

此行为是正确的,否则,如果使用不同的值更改对象一和对象二,则在持久化它们时会遇到问题。发生的事情是调用加载对象两次更新了第一次调用中加载的实体。它们必须指向相同的对象,因为它们是相同的对象。这样可以确保脏数据无法写入。

如果在两次调用之间调用em.clear(),则实体1应该分离,您的支票将返回false。但是没有必要这样做,eclipse链接实际上会将您的数据更新为最新的数据,我想这是您想要的最新数据,因为它经常更改。

附带说明一下,如果您希望使用JPA更新此数据,则需要获取Entity上的悲观锁,以便基础数据无法在DB中更改。

您还需要禁用查询缓存,并且您的缓存选项只是从播放中删除对象缓存,而不是查询缓存,这就是为什么您未获得新结果的原因:

在您的代码中:

em.createNamedQuery("MyLocation.findMyLoc").setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache).getResultList().get(0);

或在persistence.xml中:

<property name="eclipselink.query-results-cache" value="false"/>


 类似资料:
  • 问题内容: 我有一些缓存问题。我正在运行一个很小的Web应用程序,该应用程序读取一帧并将其保存到磁盘,然后在浏览器窗口中显示。 我知道,这可能不是最好的解决方案,但是每次我使用相同的名称保存此读取帧时,任何浏览器都会对其进行缓存。 我试图使用html meta-tags-没有成功: 另外,我已经尝试过这一步骤(特定于烧瓶): 这是我尝试修改标头的方式: Google Chrome和Safari仍然

  • 问题内容: 我现在有点泡菜。我正在构建一个将从CGI后端获取数据的网页。我无法控制CGI后端,也无法控制服务器(因此无法控制mod_headers或mod_expires)。同样,由于脚本的参数,我无法向每个请求附加唯一值(例如’&089u0af0d98)。使用XmlHttpRequest对象的请求是AJAX。我尝试设置“ If-Modified-Since”和“ Cache-Control”请求

  • 我制作了一个html文件,在这里我使用JavaScript从文本文件中查看表列表。这里的问题是,每次我在平板电脑的PhoneGap中输入页面时,它都会显示旧内容。在我的电脑上试用时,我必须键入Ctrl F5以获取最新内容。 如何让我的html页面更新PhoneGap中的内容? 我找到了一些用于禁用缓存的元标记,但它对我不起作用。

  • 我正在为我的服务编写单元测试。 当应用程序运行时,每次进入方法A都会创建一个新的事务。而是在单元测试执行期间——当test testMethod进入时。所以方法A不会创建新的。为了进行正确的测试,我需要在每次调用内部测试服务之前清除缓存。我不想在每个单元测试中的任何服务调用之前编写Session.clear()。这里的最佳实践是什么?

  • 问题内容: 我正在尝试在特定网站上抓取网页。该网页因我发送的不同Cookie的设置而有所不同。 如果我一一请求到网页,它给我正确的结果,但是当我在for循环中发送这些cookie时,它给了我相同的结果。我认为scrapy正在为我创建缓存,并在第二个请求中从缓存中获取响应。这是我的代码: 我希望print语句应为两个请求提供不同的结果。 如果不清楚,请在评论中提及。 问题答案: 缓存可以通过两种方式

  • 我正在使用WildFly 8.1,所以JPA 2.1和Hibernate 4.3.5 我想在WildFly中使用JPA共享缓存/二级缓存 我遵循WildFly文档:https://docs.jboss.org/author/display/WFLY8/JPA参考指南#使用InfinispanSecondlevelCache的JPA参考指南 这是我的persitience.xml: 我将属性设置为h