专栏首页码猿技术专栏Hibernate之一级缓存

Hibernate之一级缓存

文章目录

  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的查询语句
@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的缓存区
@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对象从一级缓存中清除
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语句

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Hibernate中的三种状态

    爱撒谎的男孩
  • Redis使用场景

    爱撒谎的男孩
  • scrapy的下载器中间件

    2. process_response(request, response, spider) process_response() 必须返回以下之一: ...

    爱撒谎的男孩
  • 网络篇—浏览器缓存(一)

    keyWords
  • 浏览器 HTTP 协议缓存机制详解

    最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control、为什么明明设置了 no cache 却还是发请求,为...

    用户1177713
  • 扩展CakePHP的CacheHelper以使用缓存引擎

    CakePHP是一个MVC设计模式下的PHP框架,它使得您的生活更加简单并且让您的开发工作更上一层楼。尽管它被认为是一个相对缓慢的框架,(因为)它带有的大量缓存...

    Noah____________________
  • unity3d之按秒倒计时

    在 time 秒后调用 methodName 方法,然后每 repeatRate 秒调用一次。

    李小白是一只喵
  • 从输入网址到页面呈现的过程

    WEB应用的本质 1、用户请求远程资源 2、浏览器查找远程资源,打包用户请求并发送 3、服务器根据请求,通过逻辑计算,回复结果给浏览器 4、浏览器解析结果,呈现...

    小古哥
  • 亿及流量多级缓存 - 客户端缓存

    在HTTP协议中If-Modified-Since和If-None-Match分别对应Last-Modified和ETag

    Parker
  • read-through,write-through与write-behind模式

    在hazelcast的官方文档中,提到了其支持read-through,write-through与write-behind三种模式。查阅资料,最后在oracl...

    随风溜达的向日葵

扫码关注云+社区

领取腾讯云代金券