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

使用JPA2进行Hibernate 3.6.2 2级缓存的工作示例?

岳昊空
2023-03-14
问题内容

标题显然表明:我无法使JPA2 / Hibernate 3.6.3的二级缓存起作用。

我一直在尝试许多方法来使其工作。但是我只能成功地使查询缓存起作用。尽管Hibernate创建了缓存(实例的名称),但它们被忽略。甚至未命中也不会注册。可能是版本不兼容。我尝试了其他一些方法,但没有结果。而且我不再尝试所有排列的任务了。:-P

我在这里问这个问题,因为有些人似乎可以解决这个问题(我也尝试过这些示例)。也许他们可以发现我正在犯的明显错误。

预先感谢任何帮助我的人!:-)

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">

<persistence-unit name="foo" transaction-type="RESOURCE_LOCAL">
    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:derby:/opt/db/foo;create=true"/>
        <property name="javax.persistence.jdbc.user" value="foo"/>
        <property name="javax.persistence.jdbc.password" value="bar"/>
        <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
        <property name="hibernate.hbm2ddl.auto" value="create"/>
        <property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory"/>
        <property name="hibernate.cache.use_second_level_cache" value="true"/>
        <property name="hibernate.cache.use_query_cache" value="true"/>
    </properties>
</persistence-unit>

pom.xml

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>3.6.3.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.0-api</artifactId>
        <version>1.0.0.Final</version>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache-core</artifactId>
    <version>2.4.2</version>

JMX设置

这样,我可以检查缓存的使用情况。创建了缓存(每个实体一个),两个查询缓存也在那里。后者的填充速度非常快。但是,没有任何缓存显示任何未命中或命中。甚至没有查询缓存。

 ManagementService.registerMBeans( CacheManager.getInstance(), ManagementFactory.getPlatformMBeanServer(), true, true, true, true, true )

实体缓存将被忽略。它们至少应包含保存到数据库中的实体。或通过查询进行检索。那里什么都没有动。

示例Java代码

EntityManager entityManager = Persistence.createEntityManagerFactory("foo").createEntityManager();
entityManager.getTransaction.begin();
entityManager.merge(bar);
entityManager.getTransaction.commit();

Query query = entityManager.createQuery("select b from Bar p where b.name = :name");
query.setParameter("name", "fooBar");
query.setHint("org.hibernate.cacheable","true");
query.getSingleResult();

合并有效-因为数据库中有数据。该查找有效,因为我正在获取具有生成ID的对象。

查询的实体在数据库上建立索引。

WHODUNNIT?


问题答案:

找到了罪魁祸首-尽管这很违反直觉:

除非关闭会话/实体管理器,否则查询的实体不会放入二级缓存中。即使您使用完全相同的对象重新查询,仍然不会进行缓存。

我有一个漫长的批处理过程,在其中创建和重用了许多参考对象。如果我一直保持相同的实体管理器,则看不到流程的结束。如果我在每个周期都重新创建实体管理器,则应用程序运行正常。

我以为有一级缓存-持久性上下文?



 类似资料:
  • 我使用SpringBoot1.2.5和JPA2来注释实体(并将hibernate作为JPA实现的底层)。 我想在该设置中使用二级缓存,因此实体被注释为 我还在application.properties中添加了以下内容: 在启动过程中,hibernate抱怨缺少,因此我也将此添加到pom中: 但是像这样的查询仍在触发DB查询,而不是使用缓存数据。 你知道少了什么吗?

  • 我在使用AFNetworking和ETag值实现缓存时遇到问题。我的服务器为每个请求返回Cache-Control和ETag头值。但如果我再次请求相同的资源,AFNetworking将不会添加ETag。我应该手动保存每个响应的etag并将其附加到下一个请求吗? 在应用程序委托中,我已经设置了缓存对象: 另外,我使用的是AFHTTPRequestSerializer的默认缓存策略。 有什么想法吗?问

  • 我使用workbox运行时缓存来缓存外部调用(materialize.css就是其中之一)。在“我的网络”选项卡中,它显示请求来自serviceWorker(看起来不错): 但是在缓存存储上,我的运行时缓存看起来是空的: 你可以在chromes的应用标签上看到我的服务人员,这是网站:https://quack.surge.sh/ 服务工作者代码: 这是预期的行为吗?我对服务人员还很陌生,我不确定什

  • 问题内容: 我正在开发hibernate+ ehcache程序。 ehcache.xml 我在bean.xml中提到了ehcache 我在dao类中的调用方法是 输出为: 但是它在数据库中命中了两次。我在代码中没有发现任何错误。请向我建议为什么它在数据库中命中了两次。 问题答案: 我已经解决了我的问题。我需要添加 在域类中。

  • 问题内容: 我需要在应用程序中缓存一些数据,并且我正在考虑使用Ehcache。我有几个问题: 我是否需要其他服务器进行Ehcache? 我是否需要其他客户端来使用Ehcache? Ehcache如何与多个实例一起使用?甚至可以使用Ehcache创建类似共享缓存的内容吗? 问题答案: 我是否需要其他服务器进行Ehcache? 您可以在独立模式下使用Ehcache。在这种拓扑中,缓存数据保存在应用程序

  • 问题内容: 当我更新网站时,请运行npm run build并将新文件上传到服务器,但我仍在查找网站的旧版本。 没有React,我可以看到带有缓存清除功能的新版本站点。我这样做: 上一个档案 新文件 我该怎么做或通过create react app实现缓存清除? 在GitHub上有很多关于此的react app线程,但是没有人给出正确/简单的答案。 问题答案: 编辑:create-react-ap