Я пытаюсь заставить работать кеш спящего режима второго уровня, используя реализацию ehcache.
Я уверен, что это какая-то очевидная ошибка новичка, но я не понимаю, что это такое!
Чтобы проверить свой кеш, я делаю следующее:
Создание объекта и его сохранение. Я «получаю» его один раз в транзакции, где я вижу, что возвращаю объект без обращения к базе данных, что является просто кешем первого уровня спящего режима, выполняющим свою работу.
Затем я фиксирую транзакцию и начинаю новый сеанс.
На этот раз, когда я «получаю» объект, я вижу промах кеша из ehcache в отладках. Я ожидал, что объект сейчас будет в кеше, поскольку я сохранил его в предыдущей транзакции?
Вот мой код:
Session session = getSession();
session.beginTransaction();
Test1 test1a = new Test1();
test1a.setId(5);
test1a.setName("Test 1");
test1a.setValue(10);
// Touch it
session.save(test1a);
// Now get it
Test1 test1b = (Test1)session.get(Test1.class, 5);
// Within a transaction, the session caches it - no db hit
System.out.println("GOT object with value "+test1b.getValue());
session.getTransaction().commit();
System.out.println("Between sessions");
session = getSession();
session.beginTransaction();
test1b = (Test1)session.get(Test1.class, 5);
System.out.println("GOT object with value "+test1b.getValue());
session.getTransaction().commit();
И вот соответствующая часть моего hibernate.cfg.xml
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
И мой ehcache.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ehcache.sf.net/ehcache.xsd">
<cache name="com.play.hibernate1.Test1" maxElementsInMemory="1000" eternal="false" timeToLiveSeconds="600" overflowToDisk="false"/>
<defaultCache maxElementsInMemory="10000" eternal="false"
overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="20" diskPersistent="true" />
</ehcache>
И мои аннотации
@Entity
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class Test1 {
И журналы отладки
11:21:03,474 DEBUG CacheManager:239 - Configuring ehcache from classpath. 11:21:03,479 DEBUG ConfigurationFactory:122 - Configuring ehcache from ehcache.xml found in the classpath: file:/Users/bw/Documents/workspace/hibernate1/target/classes/ehcache.xml 11:21:03,479 DEBUG ConfigurationFactory:87 - Configuring ehcache from URL: file:/Users/brucewood/Documents/workspace/hibernate1/target/classes/ehcache.xml 11:21:03,480 DEBUG ConfigurationFactory:139 - Configuring ehcache from InputStream 11:21:03,485 DEBUG BeanHandler:213 - Ignoring ehcache attribute xmlns:xsi 11:21:03,485 DEBUG BeanHandler:213 - Ignoring ehcache attribute xsi:noNamespaceSchemaLocation 11:21:03,517 DEBUG ConfigurationHelper:208 - No CacheManagerEventListenerFactory class specified. Skipping... 11:21:03,518 DEBUG ConfigurationHelper:183 - No CachePeerListenerFactoryConfiguration specified. Not configuring a CacheManagerPeerListener. 11:21:03,518 DEBUG ConfigurationHelper:159 - No CachePeerProviderFactoryConfiguration specified. Not configuring a CacheManagerPeerProvider. 11:21:03,525 DEBUG ConfigurationHelper:135 - No BootstrapCacheLoaderFactory class specified. Skipping... 11:21:03,526 DEBUG ConfigurationHelper:135 - No BootstrapCacheLoaderFactory class specified. Skipping... 11:21:03,532 DEBUG MemoryStore:73 - Initialized net.sf.ehcache.store.LruMemoryStore for com.play.hibernate1.Test1 11:21:03,533 DEBUG LruMemoryStore:71 - com.play.hibernate1.Test1 Cache: Using SpoolingLinkedHashMap implementation 11:21:03,533 DEBUG Cache:429 - Initialised cache: com.play.hibernate1.Test1 1528 [Finalizer] INFO org.hibernate.connection.DriverManagerConnectionProvider - cleaning up connection pool: jdbc:mysql://localhost:3306/play 1668 [main] INFO org.hibernate.impl.SessionFactoryObjectFactory - Not binding factory to JNDI, no JNDI name configured GOT object with value 10 Hibernate: /* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?) 1274984463818|1|1|batch|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 1', 10, 5) 1274984463820|1|1|statement|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values (?, ?, ?)|/* insert com.play.hibernate1.Test1 */ insert into Test1 (name, value, id) values ('Test 1', 10, 5) 1274984463821|1|1|commit|| Between sessions 11:21:03,823 DEBUG EhCache:68 - key: com.play.hibernate1.Test1#5 11:21:03,823 DEBUG MemoryStore:138 - com.play.hibernate1.Test1Cache: com.play.hibernate1.Test1MemoryStore miss for com.play.hibernate1.Test1#5 11:21:03,823 DEBUG Cache:661 - com.play.hibernate1.Test1 cache - Miss 11:21:03,824 DEBUG EhCache:77 - Element for com.play.hibernate1.Test1#5 is null Hibernate: /* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=? 1274984463829|4|1|statement|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=?|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=5 1274984463831|-1||resultset|/* load com.play.hibernate1.Test1 */ select test1x0_.id as id0_0_, test1x0_.name as name0_0_, test1x0_.value as value0_0_ from Test1 test1x0_ where test1x0_.id=5|name0_0_ = Test 1, value0_0_ = 10 GOT object with value 10 1274984463834|0|1|commit||
Спасибо за вашу помощь!