Hibernate的Session及其缓存

  前边我们详细的讲述了一个Hibernate的HelloWorld的程序的具体的内容:一个持久化类(必须带有无参构造器用于反射创建对象,setter/getter方法,标识主键的属性,非final的类和属性,重写equals和hashcode方法用于向Session的集合性质的缓存中存放类的对象);对象关系映射文件(注意id);Hibernate的映射文件(连接数据库和Hibernate的其他的属性以及加载Mapping映射文件,注意生成数据表的策略这个属性的四种策略hbm2ddl.auto);通过Hibernate提供的API访问数据库(Configuratioin对象,ServiceRegistry对象,SessionFactory对象,Session对象,Transaction对象)。

  前边我们讲过了Configuration这个对象相当于代表了一个Hibernate的配置文件,ServiceRegistry相当于Hibernate4的一个新的接口,所有的基于Hibernate的配置或者服务都必须向这个接口进行注册才可以使用,SessionFactory相当于一个和单个数据库建立连接的映射的镜像,用来创建Session对象;Transaction是HIbernate进行数据库操作之前必须要开启的事务对象,若不开启则操作数据库的内容是失败的,无效的。那么今天,我们来好好的讲一讲Session这个对象及其具有的缓存的功能。

  1.Session概述

  ① Session接口数Hibernate提供的操作数据库的最主要的接口,这个接口中有一系列更新,删除,保存和加载(根据唯一的UID将数据记录转换为对象到内存中)的方法。

  ② Seesion的对象具有一个一级的缓存,位于一级缓存中的对象称之为持久化的对象(这些对象和数据库中的一些记录一一对应)。Session可以在某些时间点按照缓存中对象的变化来执行相关的SQL语句,来同步更新数据库,这一个过程称之为刷新缓存。

  2.Session缓存

  ① Session接口的实现类中包含一系列的Java的集合,这些Java的集合构成了Session缓存,只要Session的实例还没有结束生命周期,且没有清理缓存,那么这个Session对象中的缓存中的对象也不会结束生命周期,哪怕没有任何变量引用这些位于缓存中的持久化的对象

  ② Session缓存的功能

  Session缓存可以有效的减少HIbernate应用程序访问数据库的频率。因为它可以从缓存中拿取数据,而不必再从数据库中拿取数据

  ③ Session实例对象的方法

   flush():刷新缓存的方法。主要目的是强制性的将数据库中的数据记录和Session缓存中的对象保持一致。因为我们可能会操作Session缓存中的对象,所以一旦这些对象发生了变化,那么数据库中的数据记录就会和之前对应的对象不一致了,所以我们需要使用flush()方法刷新一下缓存。

  flush()方法的使用场景:

  一是在调用事务的commit()方法的时候,在真实的调教事务之前会调用一次session.flush()的方法来刷新Session的缓存。

  二是可以在编写的代码中手动的刷新一下缓存。

  三是当我们使用HQL或者QBL查询时,因为要求查到的对象是最新的,所以也会执行一次flush()的方法。

  refresh();这个方法会强制性的发出查询语句使得Session缓存中的对象和数据库中的记录保持一致。

  需要注意的是,使用这个方法前必须查看数据库针对事务的隔离级别是什么,我们必选将数据库的隔离级别设置成读已提交的即2--read_commited才可以使refresh()方法生效。MySql默认数据库隔离级别是repeatable_read(可重复读),Oracle数据库的默认隔离级别是read_commited

  clear():顾名思义,就是清除Session实例中的缓存对象。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值