我正在尝试使用EhCacheProvider在hibernate应用程序中配置二级缓存。 我在hibernate.cfg.xml中完成了配置:
<!-- Second-level cache -->
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
我已将我的实体注释为:
@Entity(name = "UserDetails")
@Table(name = "user_details")
@Cacheable(true)
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class UserDetails {
private int id;
private String userName;
public UserDetails(){}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "user_name")
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
在我的测试课程中:
public class Test {
public static void main(String[] args){
SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory();
Session session = factory.openSession();
Session session2 = factory.openSession();
try{
session.get(UserDetails.class, 1);
session.close();
session2.get(UserDetails.class, 1);
}catch(Exception e){
e.printStackTrace();
}finally{
session2.close();
}
}
}
我对二级缓存的了解是,如果一个对象首先从db获取它存储在第二级缓存中的任何会话,并且如果我们尝试从另一个会话中获取相同的对象,则从第二级缓存中获取缓存级别。
因此,根据Test类,hibernate应该有1个选择查询,但我在控制台上得到2个选择查询。
如果我改变了
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) //<-- READ_ONLY instead of READ_WRITE
我只通过hibernate获取一个查询(预期结果)
所以如果我设置CacheConcurrencyStrategy.READ_WRITE,我无法理解为什么会得到2个选择查询。
我正在使用Hibernate 3.3.2和ehcache-2.8.1
这种情况下的任何亮点都会受到赞赏。
感谢。
答案 0 :(得分:0)
会话事务时间应大于缓存更新时间。 更改您的代码如下 -
public class Test { public static void main(String[] args){ SessionFactory factory = new AnnotationConfiguration().configure().buildSessionFactory(); Session session = factory.openSession(); try{ session.get(UserDetails.class, 1); session.close(); Session session2 = factory.openSession(); session2.get(UserDetails.class, 1); }catch(Exception e){ e.printStackTrace(); }finally{ session2.close(); } } }