将 ehCache 应用于 jar

问题描述

我正在为应用程序使用 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。

缓存仅在没有连接和内部查询的单表查询上工作正常。有没有人帮我让它也适用于连接查询和内部查询。?

注意事项

  1. 注解不可能,因为我们处理的是类文件

@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; 
} 
  1. jpa注解已经只用在实体类文件中,只缺少缓存,我们需要在不干扰类文件的情况下进行配置。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...