/* * Copyright Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.ehcache.docs; import java.io.File; import java.io.IOException; import org.ehcache.Cache; import org.ehcache.CacheManager; import org.ehcache.PersistentCacheManager; import org.ehcache.config.CacheConfiguration; import org.ehcache.config.ResourcePools; import org.ehcache.config.ResourceType; import org.ehcache.config.builders.CacheConfigurationBuilder; import org.ehcache.config.builders.CacheEventListenerConfigurationBuilder; import org.ehcache.config.builders.CacheManagerBuilder; import org.ehcache.config.builders.ResourcePoolsBuilder; import org.ehcache.config.units.EntryUnit; import org.ehcache.config.units.MemoryUnit; import org.ehcache.docs.plugs.ListenerObject; import org.ehcache.event.EventType; import org.ehcache.impl.config.store.disk.OffHeapDiskStoreConfiguration; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; /** * Tiering */ public class Tiering { @Rule public TemporaryFolder folder = new TemporaryFolder(); @Test public void tierSizing() { // tag::heap[] ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10, EntryUnit.ENTRIES); // <1> // or ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10); // <2> // or ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10, MemoryUnit.MB); // <3> // end::heap[] // tag::offheap[] ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(10, MemoryUnit.MB); // <1> // end::offheap[] } @Test public void testSingleTier() { // tag::offheapOnly[] CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, // <1> ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(2, MemoryUnit.GB)).build(); // <2> // end::offheapOnly[] } @Test public void threeTiersCacheManager() throws Exception { // tag::threeTiersCacheManager[] PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() .with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))) .withCache("threeTieredCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .heap(10, EntryUnit.ENTRIES) .offheap(1, MemoryUnit.MB) .disk(20, MemoryUnit.MB, true) ) ).build(true); // end::threeTiersCacheManager[] persistentCacheManager.close(); } @Test public void persistentCacheManager() throws Exception { // tag::persistentCacheManager[] PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() // <2> .with(CacheManagerBuilder.persistence(new File(getStoragePath(), "myData"))) // <1> .withCache("persistent-cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.MB, true)) // <3> ) .build(true); persistentCacheManager.close(); // end::persistentCacheManager[] } @Test public void diskSegments() throws Exception { // tag::diskSegments[] String storagePath = getStoragePath(); PersistentCacheManager persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder() .with(CacheManagerBuilder.persistence(new File(storagePath, "myData"))) .withCache("less-segments", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder().disk(10, MemoryUnit.MB)) .add(new OffHeapDiskStoreConfiguration(2)) // <1> ) .build(true); persistentCacheManager.close(); // end::diskSegments[] } @Test public void updateResourcesAtRuntime() throws InterruptedException { ListenerObject listener = new ListenerObject(); CacheEventListenerConfigurationBuilder cacheEventListenerConfiguration = CacheEventListenerConfigurationBuilder .newEventListenerConfiguration(listener, EventType.EVICTED).unordered().synchronous(); CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10L, EntryUnit.ENTRIES)) .add(cacheEventListenerConfiguration) .build(); CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder().withCache("cache", cacheConfiguration) .build(true); Cache<Long, String> cache = cacheManager.getCache("cache", Long.class, String.class); for(long i = 0; i < 20; i++ ){ cache.put(i, "Hello World"); } assertThat(listener.evicted(), is(10)); cache.clear(); listener.resetEvictionCount(); // tag::updateResourcesAtRuntime[] ResourcePools pools = ResourcePoolsBuilder.newResourcePoolsBuilder().heap(20L, EntryUnit.ENTRIES).build(); // <1> cache.getRuntimeConfiguration().updateResourcePools(pools); // <2> assertThat(cache.getRuntimeConfiguration().getResourcePools() .getPoolForResource(ResourceType.Core.HEAP).getSize(), is(20L)); // end::updateResourcesAtRuntime[] for(long i = 0; i < 20; i++ ){ cache.put(i, "Hello World"); } assertThat(listener.evicted(), is(0)); cacheManager.close(); } @Test public void testPersistentDiskTier() throws Exception { // tag::diskPersistent[] CacheManagerBuilder.newCacheManagerBuilder() .with(CacheManagerBuilder.persistence(getStoragePath())) // <1> .withCache("myCache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder().disk(1, MemoryUnit.GB, true))); // <2> // end::diskPersistent[]f } @Test public void testNotShared() { // tag::notShared[] ResourcePools pool = ResourcePoolsBuilder.newResourcePoolsBuilder().heap(10).build(); CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withCache("test-cache1", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, pool)) .withCache("test-cache2", CacheConfigurationBuilder.newCacheConfigurationBuilder(Integer.class, String.class, pool)) .build(true); // end::notShared[] } @Test public void byteSizedTieredCache() { // tag::byteSizedTieredCache[] CacheConfiguration<Long, String> usesConfiguredInCacheConfig = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .heap(10, MemoryUnit.KB) // <1> .offheap(10, MemoryUnit.MB)) // <2> .withSizeOfMaxObjectGraph(1000) .withSizeOfMaxObjectSize(1000, MemoryUnit.B) // <3> .build(); CacheConfiguration<Long, String> usesDefaultSizeOfEngineConfig = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.newResourcePoolsBuilder() .heap(10, MemoryUnit.KB)) .build(); CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder() .withDefaultSizeOfMaxObjectSize(500, MemoryUnit.B) .withDefaultSizeOfMaxObjectGraph(2000) // <4> .withCache("usesConfiguredInCache", usesConfiguredInCacheConfig) .withCache("usesDefaultSizeOfEngine", usesDefaultSizeOfEngineConfig) .build(true); // end::byteSizedTieredCache[] } private String getStoragePath() throws IOException { return folder.newFolder().getAbsolutePath(); } }