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

使用Hibernate、EhCache和Wildlfy设置二级缓存的参数

牛枫
2023-03-14

我的应用程序使用Hibernate和EhCache作为二级缓存提供者。该应用程序部署在Wildfly 8.2上。二级缓存按预期配置并工作,但我不知道如何以通用方式在echache.xml配置中为二级缓存提供单独的配置。目前我的设置如下:

实体:

     /**
     * The Country class
     */
    @Entity
    @Table(name = "country")
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "ENTITY_L2_CACHE")
    public class Country extends AbstractPersistentEntity {}

pesistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
    <persistence-unit name="app_PU" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>jdbc/app</jta-data-source>
        <exclude-unhtml" target="_blank">listed-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="hibernate.enable_lazy_load_no_trans" value="true"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.SQLServer2008Dialect"/>
            <property name="hibernate.transaction.jta.platform" value="com.torqueits.pos.jpa.ProxyJtaPlatform"/>
            <!-- enabling L2 cache -->
            <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
            <property name="hibernate.generate_statistics" value ="false" /> 
            <property name="hibernate.cache.use_second_level_cache" value="true"/>
            <property name="hibernate.cache.use_query_cache" value="false"/>
            <property name="hibernate.cache.ehcache.statistics" value="false"/>
            <property name="hibernate.generate_statistics" value="false"/>
        </properties>
    </persistence-unit>
</persistence>

还有ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" name="torqueCacheManager">
    <diskStore path="java.io.tmpdir"/>
    <!-- Fail safe default cache-->
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        ...
        memoryStoreEvictionPolicy="LRU">        
    </defaultCache>
    <cache name="ENTITY_L2_CACHE"  
       maxElementsInMemory="10000"
       ...
       diskExpiryThreadIntervalSeconds="120"
       memoryStoreEvictionPolicy="LRU"/>        
</ehcache>

虽然我将实体配置为使用ENTITY_ L2_

application.war#app_PU.ENTITY_L2_CACHE

即使用部署名称加持久性单元名称作为区域的前缀。我无法控制部署名称,因此我无法将'application.war#app_PU。ENTITY_L2_CACHE'放入.xml。我不确定这是否与Hibernate或wildefly服务器有关。

是否有任何方法可以为不绑定到特定部署名称的二级缓存配置参数?

共有1个答案

杜翰林
2023-03-14

看着

org.hibernate.cfg.AvailableSettings

班,我发现

'hibernate.cache.region_prefix'

控制缓存区域前缀的参数。因此,为了解决这个问题,我需要配置一些前缀,然后在ehCache.xml配置文件中为L2缓存使用这个前缀。

参数应设置在persistence.xml文件中:

<property name="hibernate.cache.region_prefix" value="com.example.app"/>
 类似资料:
  • 在我的查询(查找)get cached会话关闭后,在一个新会话中,在我通过随机写入Sql查询更改数据库后,hibernate正在逐出所有内容,我如何才能阻止这种情况发生?我正在研究为那些很少改变的事情制定政策。 ecache。xml SpringHibernate配置

  • 让我澄清一下我对二级缓存的理解。在我的web应用程序的基类中有一个查询。几乎每一个操作都会调用此查询(我使用的是Struts,这就是应用程序的设计方式,因此不会真正弄乱它),例如,加载我的主页会调用三个单独的Struts操作,并为每个操作执行此查询。QueryDsl形式的查询看起来像

  • 问题内容: 我想在hibernate项目中使用二级缓存,但是我只对hibernate二级缓存了解一点,任何人都可以解释我应该如何在代码中使用它以及需要什么配置和.jar文件吗?我将这些设置设置为我的hibernate.cfg.xml文件 并添加这些jar文件, 我想知道我是否需要更改其他配置? 我怎么知道我的项目使用二级缓存? 如果只是设置此设置,hibernate将自动使用此设置,否则我必须在我

  • 问题内容: 我找到了一些说明,说明如何配置纯hibernate模式以使用EHCache。但是我找不到任何有关如何配置JPA2.0 EntityManager以使用缓存的说明。Hibernate 3.5.2是我的JPA2.0提供程序。 编辑// 对实体足够了吗?还是应该使用配置实体? 问题答案: 我找到了一些说明,说明如何配置纯hibernate模式以使用EHCache。但是我找不到任何有关如何配置

  • 本文向大家介绍Hibernate中一级缓存和二级缓存之间的区别,包括了Hibernate中一级缓存和二级缓存之间的区别的使用技巧和注意事项,需要的朋友参考一下 Hibernate支持两种类型的缓存,一种是第一级缓存,另一种是第二级缓存。  一级缓存是会话级缓存,它始终与会话级对象关联。这种类型的缓存用于通过缓存对象的状态来最小化Db交互。 那不是在事务中完成每次修改之后更新,而是仅在事务结束时更新

  • 我在我的web应用程序中使用hibernate ehcache。我缓存了列表,如下所示。 EHCACHE.xml 我的输出: 我的Ebtity Class: 每次放置计数增加 11。但没有其他值更改。为什么第二级缓存未命中? 为什么每次都执行查询而不是从二级缓存中获取结果? 为什么第二级放置计数在我命中它应该更新而不是插入的同一查询时增加?任何帮助都将不胜感激!!!