青岛网站建设公司招聘,制作公司主页,百度关键词推广价格,山东济南网站建设公司排名缓存分类#xff1a; ◆一级缓存Session级 ◆二级缓存SessionFactory级别 JVM级别 Hibernate查询缓存不固定(根据生命周期 来说 不固定) 生命周期#xff1a; ◆一级缓存 是和 session 会话一直 产生一直消失 ◆二级缓存 是和 sessionFacotry 一致 Hibernate查询缓存 生命周期…缓存分类 ◆一级缓存Session级 ◆二级缓存SessionFactory级别 JVM级别 Hibernate查询缓存不固定(根据生命周期 来说 不固定) 生命周期 ◆一级缓存 是和 session 会话一直 产生一直消失 ◆二级缓存 是和 sessionFacotry 一致 Hibernate查询缓存 生命周期不固定 当数据库 表发生改变的使用Hibernate查询缓存马上消失 使用方法 ◆一级缓存这个就不用说了 ◆二级缓存首先拷贝 使用Hibernate查询缓存类别.xml到 classpath目录下面,然后 到hibernate.cfg.xml里面配置。开启二级缓存(默认开启),定义要使用二级缓存的实体类,然后 就是在程序中要显示的指定session。 使用二级缓存的类别 有三种,Normal,GET,PUT默认使用的是 Normal即可以写也可以读取二级缓存(这里读写是指的会话Session) Hibernate查询缓存首先也是到hibernate配置文件中去开启Hibernate查询缓存,然后程序中也 要显示的调用方法来开启Hibernate查询缓存eg:query.setCachemodel(true); 缓存的保存对象 ◆一级缓存缓存的是 实体 ◆二级缓存 缓存的也是实体 Hibernate查询缓存缓存的是 查询出来的 实体的部分属性结果集 和 实体的ID 注意这里不是实体 缓存的使用对象 ◆一级缓存 Load(Lazy加载) 使用一级缓存当load的使用 首先查找把序列号去和一级缓存匹配是否有就直接取出来如果没有 就发出SQL语句。 Get也使用一级缓存。 List接口 query.list() 不使用 一级缓存每次 都要发出SQL eg:(select * from tudent)。Iterator 接口 query.iterate();使用一级缓存 首先是要发出一条SQL 来取得ID,eg: select。id from student; 然后 把ID 拿到缓存中去匹配 如果有 就直接取 如果没有就要再发出SQL如果 都没有 将发出N1条SQL这就是N1问题 ◆二级缓存 都使用了二级缓存 Hibernate查询缓存看到名字 顾名思义就知道 是查询 那么就是对List 和Iterator接口起作用 但是Hibernate查询缓存对Iterator不起作用只对List起作用。 下面我们这种介绍把二级缓存 和 Hibernate查询缓存 结合使用 当只是用Hibernate查询缓存 而关闭 二级缓存的时候 第一如果查询的是部分属性结果集 那么当第二次查询的时候 就不会发出SQL 直接从Hibernate查询缓存中取数据 第二如果查询的是 实体结果集eg(from Student) 这个HQL 那么 查询出来的实体首先Hibernate查询缓存 存放实体的ID 第二次查询的时候 就到Hibernate查询缓存中取出ID 一条一条的到数据库查询 这样 将发出N 条SQL造成了SQL泛滥 当都开启Hibernate查询缓存和二级缓存的时候 第一如果查询的是部分属性结果集 这个和上面只是用Hibernate查询缓存 而关闭 二级缓存的时候一致 因为不涉及实体 不会用到二级缓存 第二如果查询的是 实体结果集eg(from Student) 这个HQL 那么 查询出来的实体首先Hibernate查询缓存 存放实体的ID第二次查询的时候 就到Hibernate查询缓存中取出ID,拿到二级缓存区找数据如果有数据 就不会发出SQL 如果都有 一条SQL 都不会发出 直接从二级缓存中取数据。转载于:https://www.cnblogs.com/meipeng/articles/2326018.html