前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hibernate之一级缓存

Hibernate之一级缓存

作者头像
爱撒谎的男孩
发布2019-12-31 15:00:48
5110
发布2019-12-31 15:00:48
举报
文章被收录于专栏:码猿技术专栏码猿技术专栏

文章目录

  1. 1. Hibernate之一级缓存
    1. 1.1. 什么是一级缓存
    2. 1.2. 为什么使用一级缓存
    3. 1.3. 如何使用一级缓存
    4. 1.4. 一级缓存的规则
    5. 1.5. 一级缓存管理
    6. 1.6. 总结

Hibernate之一级缓存

什么是一级缓存

  • Hibernate创建每个Session对象时,都会给Session分配一块独立的缓存区,用于存放Session查询出来的对象,这个分配给Session的缓存区称之为一级缓存,也叫Session级缓存

为什么使用一级缓存

  • Session读取数据时,会优先向缓存区取数据,如果存在数据直接返回,不存在才会区数据库查询,从而降低了数据库的访问次数。提升了代码的运行效率

如何使用一级缓存

  • 一级缓存默认是开启的,在使用Hibernate的API进行查询时会自动使用
  • 验证
    • 从控制台可以看到只发出一条sql的查询语句
代码语言:javascript
复制
@Test
	public void Test() {
		Session session = null;
		Transaction transaction = null;
		try {
			// 创建session
			session = HibernateUntil.getSession();
			// 开始事务
			transaction = session.beginTransaction();
			//查询id=2 的数据,这个是session的第一次查询,那么会发出sql语句
			Student student1=session.get(Student.class, 2);

			//再次使用同一个Session查询id=2的对象,由于前面已经查询过一次,因此这里不需要发出sql语句
			Student student2=session.get(Student.class,2);
			transaction.commit();
		} catch (Exception exception) {
			transaction.rollback(); // 事务回滚
		} finally {
			if (session!=null) {
				session.close();
			}
		}
	}

一级缓存的规则

  • 一级缓存是Session独享的,每个Session不能访问其他的Session的缓存区
代码语言:javascript
复制
@Test
	public void test1(){
		Session session1 = null;
		Session session2 = null;
		Transaction transaction = null;
		try {
			// 创建session
			session1=HibernateUntil.getSession(); //获取session1
			session2=HibernateUntil.getSession();
			// 开始事务
			transaction = session1.beginTransaction();
			transaction = session2.beginTransaction();
			//使用session1查询id=2的对象,这个对象会在session1的缓存区缓存
			Student s1=session1.get(Student.class, 2);
			//使用Session2查询id=2的对象,可以看到这还是会发出sql语句,因为在session2的缓存区没有这个对象
			Student s2=session2.get(Student.class, 2);
			transaction.commit();
		} catch (Exception exception) {
			transaction.rollback(); // 事务回滚
		} finally {
			if (session1!=null) {
				session1.close();
			}
		}
	}
  • Session的save,update,delete操作会出发缓存更新
    • 此时的缓存区将会将之前的查询到的对象全部清除

一级缓存管理

  • session.evit(obj) 将obj对象从一级缓存中清除
代码语言:javascript
复制
public void Test2() {
		Session session = null;
		Transaction transaction = null;
		try {
			// 创建session
			session = HibernateUntil.getSession();
			// 开始事务
			transaction = session.beginTransaction();
			//查询id=2 的数据,这个是session的第一次查询,那么会发出sql语句
			Student student1=session.get(Student.class, 2);

			//清楚一级缓存中的student1对象
			session.evict(student1);

			//再次使用同一个Session查询id=2的对象,由于前面已经清除了这个对象,因此这里还是会发出sql语句
			Student student2=session.get(Student.class,2);
			transaction.commit();
		} catch (Exception exception) {
			transaction.rollback(); // 事务回滚
		} finally {
			if (session!=null) {
				session.close();
			}
		}
	}
  • session.clear() 清除一级缓存中的所有对象
  • session.close() 关闭session,释放缓存空间

总结

  1. 一级缓存是默认开启的
  2. 一级缓存的使用可以减少服务器和数据库之间的交互,减轻服务器的压力
  3. 提高查询的效率,不必查询发出重复的sql语句
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Hibernate之一级缓存
    • 什么是一级缓存
      • 为什么使用一级缓存
        • 如何使用一级缓存
          • 一级缓存的规则
            • 一级缓存管理
              • 总结
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档