我在cfg文件中指定了以下属性。
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.EhCacheProvider</property>
在我的main1程序中,我创建id为1的人并提交并在提交后使该线程保持不变。然后我开始另一个线程T2,这是一个id为1的人,代码为
person = (Person)session. get(Person.class,1);
当T2通过上述语句时,它会在后台生成以下查询
Hibernate: select person0_.id as id0_1_, person0_.cname as cname0_1_ from MyProject1.Person person0_ where person0_.id=?
我不确定为什么线程T2从数据库读取而不是从二级缓存中获取?因为我使用用法作为读写
我的地图看起来像
<class name="com.daasl.Person" >
<cache usage="read-write"/>
<id name="id" type="int">
<generator class="increment"/>
</id>
<property name="name" column="cname" type="string"/>
</class>
答案 0 :(得分:1)
得到了问题。实际上每个主程序都有自己的jvm实例,因此它自己的会话工厂。所以二级缓存在这里不起作用。在创建人员之后,一旦会话关闭,我在同一个主程序中尝试了同样的事情。然后打开新会话并尝试获取同一个人,它从二级缓存中获取。