Hibernate中的一级缓存和二级缓存有什么区别?代码举例讲解

在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已关闭