2010-05-27 54 views
5

我想使用ehcache实现获得第二级休眠缓存工作。休眠第二级ehcache错过

我敢肯定,这是一些明显的noob错误,我正在做,但我看不到它是什么!

为了测试我的缓存,我做了以下内容:

创建一个对象并保存。我在事务中'取得'了一次,在那里我可以看到没有数据库命中的情况下返回对象,这只是hibernate一级缓存的功能。

然后我提交交易并开始一个新的会话。

这次,当我收到对象时,我可以在调试中看到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|| 

感谢您的帮助!

+0

到目前为止我追踪它到初始保存 - 我可以看到它不在缓存之后。但是,在我从数据库中检索到它后,它就在缓存中,然后我可以从缓存中取回它。所以看起来好像我的保存没有放入缓存。 – Jeremy 2010-05-27 19:56:59

回答

7

问题是我正在使用NONSTRICT_READ_WRITE。这似乎从这个解释中的文档符合该法案:

如果应用程序只偶尔 需要更新数据(也就是说,如果它是 极可能两个 交易将同时更新了 同一项目)和严格的 事务隔离不是必需的, 非严格读写缓存可能适合 。如果在JTA环境中使用高速缓存,则必须指定 hibernate.transaction.manager_lookup_class。 在其他环境中,您应该确保在调用Session.disconnect()的Session.close()或 时完成事务处理 。

但实际上它看起来像不会将保存的对象添加到缓存中。文档在这里有点薄,IMO。在Java Persistence with Hibernate中,缓存选项有更好的处理方式,但对于实际发生的数据的具体解释还有点薄弱。无论如何..

我将缓存选项更改为READ_WRITE,现在它按预期工作。

还要注意,第一次将对象添加到缓存中时,会在ehcache调试中出现“缓存未命中”。推测它看起来在它的缓存中,发现该对象不存在,记录一个未命中,然后添加该对象。之后,你会得到'点击'。

+0

+2的问题和答案 – 2010-05-28 13:28:42