Geo*_*rge 6 java hibernate spring-boot ehcache-3
我正在尝试将 EhCache 设置为 Hibernate 作为二级缓存,但 TTL 不起作用。
这是我的依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jcache</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我的 YAML 配置:
spring:
jpa:
show-sql: true
properties:
hibernate:
dialect: Dialect
cache:
use_second_level_cache: true
region.factory_class: org.hibernate.cache.jcache.JCacheRegionFactory
use_query_cache: true
cache:
jcache:
config: classpath:ehcache.xml
Run Code Online (Sandbox Code Playgroud)
这是我的实体类的配置方式:
@Entity
@javax.persistence.Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class PersonEntity {
//
}
Run Code Online (Sandbox Code Playgroud)
以及实体的 JpaRepository:
public interface PersonRepository extends JpaRepository<PersonEntity, Integer> {
@org.springframework.data.jpa.repository.QueryHints({
@javax.persistence.QueryHint(name = "org.hibernate.cacheable", value = "true")
})
List<PersonEntity> findByName(String name);
}
Run Code Online (Sandbox Code Playgroud)
我已将缓存配置为在 2 秒后过期,但调用findByName仍使用缓存(在第一个之后没有打印 SQL 查询)。
这是ehcache.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://www.ehcache.org/v3">
<cache-template name="simple">
<expiry>
<ttl>2</ttl>
</expiry>
<heap>100</heap>
</cache-template>
<cache alias="com.sample.PersonEntity" uses-template="simple"/>
</config>
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经做了一些调试。我在中添加了一个断点org.ehcache.jsr107.ExpiryPolicyToEhcacheExpiry:
javax.cache.expiry.Duration duration = this.expiryPolicy.getExpiryForCreation();
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这个持续时间是无限的。那么也许配置没有正确设置?我知道 xml 正在被读取,因为当我使其无效(例如通过删除堆标记)时,我收到一个错误。
我想我找到了问题的原因 - 您没有指定ehcache.xml文件的位置:
spring:
jpa:
properties:
hibernate:
javax.cache:
provider: org.ehcache.jsr107.EhcacheCachingProvider
uri: classpath:ehcache.xml
cache:
use_second_level_cache: true
region.factory_class: jcache
use_query_cache: true
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Hibernate 使用默认配置创建缓存。我的演示项目日志中的一个片段:
spring:
jpa:
properties:
hibernate:
javax.cache:
provider: org.ehcache.jsr107.EhcacheCachingProvider
uri: classpath:ehcache.xml
cache:
use_second_level_cache: true
region.factory_class: jcache
use_query_cache: true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7585 次 |
| 最近记录: |