使用 Hibernate、EhCache 和 Wildlfy 为 L2 缓存设置参数
Set parameters for L2 cache with Hibernate, EhCache and Wildlfy
我的应用程序使用 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-unlisted-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_CACHCE 作为二级缓存的区域,但 hibernate 使用的实际名称是
application.war#app_PU.ENTITY_L2_CACHE
它使用部署名称加上持久性单元名称作为区域前缀。我无法控制部署名称,因此无法将 'application.war#app_PU.ENTITY_L2_CACHE' 放入 ehcache.xml。我不确定这是否与休眠或 wildfly 服务器有关。
是否有任何方法可以为未绑定到特定部署名称的二级缓存配置参数?
正在查看
org.hibernate.cfg.AvailableSettings
class,我找到了
'hibernate.cache.region_prefix'
控制缓存区域前缀的参数。因此,为了解决这个问题,我需要配置一些前缀,然后在 ehCache.xml 配置文件中为 L2 缓存使用这个前缀。
参数应该在persistence.xml文件中设置:
<property name="hibernate.cache.region_prefix" value="com.example.app"/>
我的应用程序使用 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-unlisted-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_CACHCE 作为二级缓存的区域,但 hibernate 使用的实际名称是
application.war#app_PU.ENTITY_L2_CACHE
它使用部署名称加上持久性单元名称作为区域前缀。我无法控制部署名称,因此无法将 'application.war#app_PU.ENTITY_L2_CACHE' 放入 ehcache.xml。我不确定这是否与休眠或 wildfly 服务器有关。
是否有任何方法可以为未绑定到特定部署名称的二级缓存配置参数?
正在查看
org.hibernate.cfg.AvailableSettings
class,我找到了
'hibernate.cache.region_prefix'
控制缓存区域前缀的参数。因此,为了解决这个问题,我需要配置一些前缀,然后在 ehCache.xml 配置文件中为 L2 缓存使用这个前缀。
参数应该在persistence.xml文件中设置:
<property name="hibernate.cache.region_prefix" value="com.example.app"/>