问题描述
我正在为应用程序使用 Spring Boot 2.0 版。这里我们使用了一个包含大量实体的第三方 jar 文件。为了提高应用程序的性能,我们确实需要对那些 jar 包含的实体进行二级缓存。由于我们在应用程序中使用 Hibernate,因此我们更喜欢 EhCache
提供程序来实现二级缓存。
大多数网站都提供带有注释 @Cacheable
的示例,这些示例在我们的应用程序中无法使用,因为我们使用的 jar 文件实体仅包含不可编辑的类文件。因此,如果有人提供使用 xml 缓存这些 jar 文件实体的代码以及如何在 ehCacheManager 中配置这些实体,那真的会很有帮助。
版本
- Hibernate v5.x +
- ehCache v2.x +
- Spring Boot v2.x +
解决方法
你可以使用 ehcache 的 XML 配置,这里是一个小例子
在 ehcache.xml
内创建一个名为 src/main/resources
的文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"
monitoring="autodetect" dynamicConfig="true">
<diskStore path="java.io.tmpdir/ehcache" />
<defaultCache maxElementsInMemory="1000" eternal="false"
timeToIdleSeconds="3" timeToLiveSeconds="120" overflowToDisk="true" />
<cache
name="your.entity.in.jar.Entity"
maxElementsInMemory="100" eternal="false" timeToIdleSeconds="3"
timeToLiveSeconds="120" overflowToDisk="false" />
</ehcache>
访问 ehcache 站点以获取更多详细信息
https://www.ehcache.org/documentation/2.8/configuration/configuration.html
,如果您无法使用 @Cacheable
注释实体,您可以将 SharedCacheMode 设置为 ALL
此 answer 说明了如何设置二级缓存,在您的情况下,您应该将模式从 ENABLE_SELECTIVE
更改为 ALL
。另一个 answer 也应该有所帮助。
@Avinash,@Guilaume-想想我错过的链接之间的某个地方。然后在 build.gradle 中实现 EHCache,使用 @Configuration 在配置文件中配置 EhCacheCacheManager 然后在相同配置中指定 ehCache.xml 类路径位置。在 Main App.java 中启用 @EnableCaching。在persistence.xml 文件中以类文件的形式指定所有实体(即)完整路径实体类名,并在Hibernate Data Source 中设置该文件以及其他属性。在persistence.xml 中包含jar 文件实体类名,但不知道在哪里为这些实体设置缓存
,最后,我通过启用以下方式使其工作。
持久性.xml:
<persistence>
//few lines
<shared-cache-mode>ALL</shared-cache-mode>
</persistence>
eh-cache.xml:
<defaultCache name="default" maxElementsInMemory="500"
eternal="false" timeToIdleSeconds="6000" timeToLiveSeconds="12000"
overflowToDisk="false" diskPersistent="false"
memoryStoreEvictionPolicy="LRU" />
在配置文件中启用,ehcache区域工厂,二级缓存为true。
缓存仅在没有连接和内部查询的单表查询上工作正常。有没有人帮我让它也适用于连接查询和内部查询。?
注意事项
- 注解不可能,因为我们处理的是类文件
@Cacheable 或 @Cache 在实体类的集合属性之上是不可能的,因为我们正在处理类文件(使用 jars 中的实体类)。 例如:
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "TABLE_NAME",schema ="SCHEMA_NAME")
public class SampleEntity {
@Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) ***//not possible here since we deals with class files***
@OneToMany
private Collection<Bar> bars;
}
- jpa注解已经只用在实体类文件中,只缺少缓存,我们需要在不干扰类文件的情况下进行配置。