Spring Boot 2/Spring Framework5に基づくWebアプリケーションでEhCache3.5キャッシュ機能を使用しようとしました。
EHCacheの依存関係を追加しました:
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
<version>1.0.0</version>
</dependency>
次に、src/main/resourcesフォルダーに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"
monitoring="autodetect" dynamicConfig="true">
<cache name="orders" maxElementsInMemory="100"
eternal="false" overflowToDisk="false"
memoryStoreEvictionPolicy="LFU" copyOnRead="true"
copyOnWrite="true" />
</ehcache>
Spring 5リファレンスガイドではEHCacheの使用法については言及されておらず、Spring4リファレンスガイドでは次のように述べられています。
そこで、コントローラーOrderControllerとRESTエンドポイント:
@Cacheable("orders")
@GetMapping(path = "/{id}")
public Order findById(@PathVariable int id) {
return orderRepository.findById(id);
}
Spring Boot構成:
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
しかし、このエンドポイントを呼び出すと、例外が発生します。
Builderの「orders」という名前のキャッシュが見つかりません[publicorg.Order org.OrderController.findById(int)] caches = [orders] |キー= '' | keyGenerator = '' | cacheManager = '' | cacheResolver = '' |条件= '' |ない限り= '' | sync = 'false'
次に、Spring Framework4の例を使用してみました。
@Bean
public CacheManager cacheManager() {
return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}
@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
cmfb.setShared(true);
return cmfb;
}
ただし、例外のためにコンパイルされません。
タイプnet.sf.ehcache.CacheManagerは解決できません。必要な.classファイルから間接的に参照されます
お知らせ下さい。
ここにはさまざまなものがあります。使用しているEhcache3は、SpringからJCacheを介して使用されます。
そのため、spring.cache.jcache.config=classpath:ehcache.xml
を使用する必要があります。
その場合、Ehcache構成は実際にはEhcache2構成です。 EhCacheCacheManager
もそうです。 JCacheの場合、JCacheCacheManager
を使用する必要があります。しかし実際には、ehcache.xml
を使用する必要はありません。
これを機能させるための手順は次のとおりです
手順1:正しい依存関係を設定します。親pom依存関係管理によって提供されるため、バージョンを指定する必要がないことに注意してください。 javax.cacheはバージョン1.1になりました。
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
ステップ2:ehcache.xml
にsrc/main/resources
ファイルを追加します。以下の例。
<?xml version="1.0" encoding="UTF-8"?>
<config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="
http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.5.xsd
http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.5.xsd">
<service>
<jsr107:defaults enable-management="false" enable-statistics="true"/>
</service>
<cache alias="value">
<resources>
<heap unit="entries">2000</heap>
</resources>
</cache>
</config>
ステップ3:application.properties
を見つけるには、この行を含むehcache.xml
が必要です。
spring.cache.jcache.config=classpath:ehcache.xml
JCacheはクラスパスにあるため、SpringCacheはそれをキャッシュプロバイダーとして選択することに注意してください。したがって、spring.cache.type=jcache
を指定する必要はありません。
ステップ4:あなたがしたようにキャッシュを有効にする
@SpringBootApplication
@EnableCaching
public class Cache5Application {
private int value = 0;
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(Cache5Application.class, args);
Cache5Application app = context.getBean(Cache5Application.class);
System.out.println(app.value());
System.out.println(app.value());
}
@Cacheable("value")
public int value() {
return value++;
}
}
Ehcacheバージョン2を使用するように強制する必要があります
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.3</version>
</dependency>
Ehcache 3を使用するには:
アプリケーションは次のとおりです。
@SpringBootApplication
@EnableCaching
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
これがapplication.ymlです
spring:
cache:
ehcache:
config: ehcache.xml
こちらはテスト用カウンター付きのサービスです
@Service
public class OrderService {
public static int counter=0;
@Cacheable("orders")
public Order findById(Long id) {
counter++;
return new Order(id, "desc_" + id);
}
}
キャッシュを使用していることを証明するテストは次のとおりです。
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderServiceTest {
@Autowired
private OrderService orderService;
@Test
public void getHello() throws Exception {
orderService.findById(1l);
assertEquals(1, OrderService.counter);
orderService.findById(1l);
assertEquals(1, OrderService.counter);
orderService.findById(2l);
assertEquals(2, OrderService.counter);
}
}
実例については ここ を参照してください。
私は追加の調査を行いました。次の構成は、Spring Boot(application.propertiesから)によって取得されません。
spring.cache.ehcache.config=classpath:ehcache.xml
そこで、jcache.xmlを作成し、src/main/resourceフォルダーにも配置しました。
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="
http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd">
<cache alias="orders">
<key-type>org.springframework.cache.interceptor.SimpleKey</key-type>
<value-type>Java.util.Collections$SingletonList</value-type>
<heap unit="entries">200</heap>
</cache>
</config>
次に、application.propertiesの設定をに変更しました
spring.cache.jcache.config=classpath:jcache.xml
これで、SpringCachingが正しく機能するようになりました。ただし、ehcache.xmlを取得する方法はまだ疑問です。
うーん..ehcache.xmlをに変更して、トリックを行いました..
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
xsi:schemaLocation="
http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd">
<service>
<jsr107:defaults enable-management="true"
enable-statistics="true" />
</service>
<cache alias="vehicles" uses-template="heap-cache" />
<cache-template name="heap-cache">
<heap unit="entries">20</heap>
</cache-template>
</config>
同じ問題に直面しています。
私のehcache.xmlは次のようになります
<config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://www.ehcache.org/v3' xmlns:jsr107='http://www.ehcache.org/v3/jsr107' xsi:schemaLocation=" http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd"> <service> <jsr107:defaults> <jsr107:cache name="vehicles" template="heap-cache" /> </jsr107:defaults> </service> <cache-template name="heap-cache"> <heap unit="entries">20</heap> </cache-template> </config>
spring.cache.jcache.config=classpath:ehcache.xml
でapplication.properties
を構成しました
アプリケーションクラスに@EnableCaching
があります。
私のサービスの実装には@CacheResult
があります。
@CacheResult(cacheName = "vehicles")public VehicleDetail getVehicle(@CacheKey String VehicleId)throws VehicleServiceException
誰かが私が欠けているものを指摘することができれば本当に役に立ちます。