项目中大量用到了createSQLQuery, 用的倒是很爽, 后来想将查询结果缓存, 这下碰就到麻烦了,不过通过几次测试, 也顺利的缓存了结果, 赶快记下备忘, 也与大家分享.
实体类Customer.java
@SuppressWarnings("serial")
public class Customer implements java.io.Serializable{
private Integer id;
private String name;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
二级缓存怎么配就不啰嗦了, 贴上测试代码
@Test
public void testSQLQuery(){
Session s = sf.openSession();
Transaction tr = s.beginTransaction();
SQLQuery q = s.createSQLQuery("select * from customers where id=1");
q.setCacheable(true);
Customer c= (Customer) q.addEntity(Customer.class).uniqueResult();
tr.commit();
s.close();
//上述代码会发出sql语句, 关闭session再开一个session, 以同样条件再次查询
s = sf.openSession();
tr = s.beginTransaction();
q = s.createSQLQuery("select * from customers where id=1");
q.setCacheable(true);
c= (Customer) q.addEntity(Customer.class).uniqueResult();
System.out.println(c.getName()); //再次查询, 没有发出sql,说明是从缓存中取的
tr.commit();
s.close();
}
之前一直报错, 角标越界:
java.lang.ArrayIndexOutOfBoundsException: 0
后来加上addEntity()后就不报错了,至于原因是什么,我也不太清楚,我想查询缓存存的是查询条件, 类缓存存的才是数据, 不加addEntity查出来的数据就无法进入类缓存, 当再次查询时,还是得根据条件再查数据库, 就失去了缓存的意义, 所以必须用addEntity来指定实体类???
分享到:
相关推荐
Hibernate有第一级缓存和第二级缓存,第一级缓存是每个Session内部的缓存,而第二级缓存则可跨Session共享,能够显著提升性能。 总的来说,“hibernate code.rar”中的资源将会涵盖这些基础内容,并可能通过实例...
8. **缓存**:Hibernate 支持一级缓存(Session 缓存)和二级缓存,可以提高性能。可以通过配置决定是否启用和使用何种缓存策略。 9. **延迟加载(Lazy Loading)**:通过 `@OneToMany(mappedBy = "..." fetch = ...
22.4 管理Hibernate的第二级缓存 22.4.1 配置进程范围内的第二级缓存 22.4.2 配置集群范围内的第二级缓存 22.4.3 在应用程序中管理第二级缓存 22.4.4 Session与第二级缓存的交互模式 22.5 运行本章的...
2. 第二级缓存:可选配置,通过插件如Ehcache实现,跨Session共享,提高性能。 以上就是Hibernate执行持久层访问的基本步骤,掌握这些知识点,能帮助开发者高效地进行数据库操作。在实际开发中,还需要结合具体业务...
1. 使用缓存:Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),可以提高查询效率。 2. 实体类的注解配置:使用注解代替XML配置,使代码更简洁,更易于维护。 3. 数据库设计:遵循...
4. Cache:Hibernate内置了二级缓存机制,包括一级缓存Session和二级缓存SessionFactory,提高了数据访问速度。 二、Hibernate配置 1. 配置文件:hibernate.cfg.xml是Hibernate的主要配置文件,包含了数据库连接...
8. 第二级缓存:为了提高性能,Hibernate支持第二级缓存,它可以缓存整个实体或查询结果。文档会解释如何配置缓存提供商,以及如何使用缓存策略。 9. 批量操作:Hibernate提供了批量处理的API,如`Session....
6. **二级缓存的动态配置**:根据不同的数据库和业务需求,可能需要动态配置Hibernate的二级缓存策略,如Ehcache或Infinispan。 7. **事件监听器**:通过实现Hibernate的事件监听器接口,可以在对象的生命周期事件...
3. 查询级别缓存:此缓存存储查询的结果集,通常配合二级缓存使用。对于那些经常使用相同参数的查询,预加载结果可以显著提高性能。但需要注意的是,如果数据频繁更新,启用查询缓存可能会导致数据不一致。 配置...
Hibernate支持第一级缓存(Session级别的缓存)和第二级缓存(SessionFactory级别的缓存)。缓存可以减少数据库访问,提高系统性能。 八、事务管理 Hibernate提供了对JTA和 JDBC事务的支持,通过Transaction对象...
1. **第二级缓存**: Hibernate提供了二级缓存机制,可以存储已经查询过的对象,减少对数据库的访问。可以使用第三方缓存服务如EhCache或Infinispan。 2. **缓存策略**: 可以配置查询缓存,将查询结果缓存起来,避免...
- 利用缓存机制提高数据访问速度,如一级缓存(Session级)和二级缓存(SessionFactory级)。 五、最佳实践 1. 合理设计实体类:遵循单一职责原则,避免实体类过于庞大,提高代码可维护性。 2. 选择合适的映射策略...
二级缓存是SessionFactory级别的,可以跨Session共享。我们还可以配置第三方缓存提供商,如Ehcache,进一步优化性能。 七、实体关系映射 Hibernate支持多种关系映射,包括一对一(OneToOne)、一对多(OneToMany)...
为了提高性能,Hibernate支持二级缓存,它可以存储已加载的实体实例,减少对数据库的访问。常见的第二级缓存实现有Ehcache和Hibernate内置的缓存。 **8. 异步与批处理** Hibernate 支持异步操作,通过Future或...
Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的),可以提高性能,减少对数据库的访问。 **总结** 这个简单的Hibernate例程涵盖了从环境配置、实体类定义到持久化操作、事务管理和...
9. **缓存**:Hibernate 提供了两级缓存机制,一级缓存是Session级别的,自动管理,而二级缓存是SessionFactory级别的,可以配置第三方缓存插件如EhCache或Infinispan。 10. **HQL和Criteria查询**:HQL是Hibernate...
例如,使用`@Cacheable`注解启用二级缓存,或者配置查询缓存。 以上就是一个使用Hibernate进行数据库操作的完整例子。通过这个例子,我们可以看到Hibernate如何将Java对象和数据库表进行映射,以及如何执行CRUD操作...
- Hibernate的`SessionFactory`支持二级缓存,用于存储跨事务的数据,可以显著提高应用性能。 - 一级缓存(默认开启):由`Session`管理,当`Session`关闭后,缓存中的数据会被清除。 - 二级缓存(可选):由`...
Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory级别的)。第一级缓存默认开启,而第二级缓存则需要通过配置和插件实现,如EhCache或Infinispan。 10. **懒加载与即时加载** Hibernate...