在Hibernate中,缓存用于减少数据库访问次数,提高系统性能。主要有一级缓存和二级缓存两种:
一级缓存:
- 作用域为Session,存储Session执行的查询结果,重复使用。
- 生命周期与Session绑定,Session关闭缓存消失。
- 由Hibernate自动管理,无需手动配置。
例如:
Session session = factory.openSession();
Query query = session.createQuery("from Customer where id = ?");
query.setParameter(1, 1);
Customer customer1 = (Customer) query.uniqueResult();
Query query2 = session.createQuery("from Customer where id = ?");
query2.setParameter(1, 1);
Customer customer2 = (Customer) query2.uniqueResult();
// customer1 == customer2, 由一级缓存提供
二级缓存:
- 作用域为SessionFactory,所有Session共享。
- 必须手动配置与管理,生命周期独立于Session。
- 存储经常使用但不经常改变的数据,需要手动指定实体及集合是否使用二级缓存。
例如:hibernate.cfg.xml配置
<class-cache class="Customer" usage="read-only"/>
<collection-cache collection="Customer.addresses" usage="read-only"/>
Session session1 = factory.openSession();
Query query = session1.createQuery("from Customer where id = ?");
query.setParameter(1, 1);
Customer customer = (Customer) query.uniqueResult();
session1.close();
Session session2 = factory.openSession();
Query query2 = session2.createQuery("from Customer where id = ?");
query2.setParameter(1, 1);
Customer customer2 = (Customer) query2.uniqueResult();
// customer == customer2, 由二级缓存提供,session1已关闭