Hibernate 缓存机制(二)

本文详细介绍了Hibernate ORM技术的特点及应用,包括对JDBC操作的封装、简化DAO层代码、减少Java代码中的SQL语句等内容。同时对比了session.load与session.get方法的区别,并解析了一级缓存和二级缓存的作用机制。

为什么使用hibernate
  1、对JDBC操作提供封装,方便操作简化数据库访问的代码(connection,eparedStatement,resultSet);
  2、简化DAO层的代码量ORM从关系型DB到面向对象(java)的转变
  3、在java代码中充斥着大量的sql语句不便于维护,但是ORM映射可以减少此类代码,便于维护

session.load和session.get的区别
  两者都是用缓存,load查询数据如果没有会出现Exception ,get会出现null
  load支持lazy , get不支持lazy
  load 查询 先查一级缓存,如果没有数据则会生成ciglib,在实际使用的时候(也就是lazy=true)查询二级缓存,还没有数据查询数据库,在没有就会出现异常,主意这里是Exception
  get 先查询一级缓存,在查询二级缓存最后查询数据库如果没有数据则出现null

hibernate中lazy的有效期是在session打开状态下
<class>上的lazy特性会影响普通属性

一级缓存是session级别的二级缓存是sessionFactory级别的
session使用evict和clear来管理缓存,不同的session不能共享数据但是可以共享sessionFactory
session和sessionFactory中存储的形式类似于Map 的键值对
key为实体对象的ID value 为实体对象

get load iterator 使用一级缓存  save方法支持缓存

list和iterate的区别?
* list每次都会发出查询语句,list向缓存中放入数据,但不利用缓存中的数据
* iterate在默认情况下利用缓存中的数据,只有在缓存中根据id无法找到相应

list不使用一级缓存 只会向 缓存中插入数据 所以list 每次都会发出sql语句

iterator N+1 问题
iterator查询实体对象会发出查询 ID 列表的sql语句如果一级二级缓存有数据则不发出查询实体的sql语句,如果没有则直接查询DB
list N+1 问题
实用查询缓存
查询实体对象
二级缓存不存在或是过期或者是evict

关于查询缓存:
hibernate查询缓存

查询缓存是针对普通属性结果集的缓存
对实体对象的结果集会缓存id

查询缓存的生命周期,当关联的表发生修改,那么查询缓存的生命周期结束

查询缓存的配置和使用:
* 启用查询缓存,修改hibernate.cfg.xml文件
<property name="hibernate.cache.use_query_cache">true</property>
* 在程序中必须启用,如:
       query.setCacheable(true);

----------------------------------------------

* 开启查询缓存,关闭二级缓存
  开启一个session,分别调用两次query.list()查询普通属性
  每次调用list 都要设置  query.setCacheable(true);

  只发出一条sql语句;
 
* 开启查询缓存,关闭二级缓存
  开启两个session,分别调用query.list()查询普通属性
 
第二次query.list()不会发出查询sql,因为查询缓存的生命周期和session无关
 
* 开启查询缓存,关闭二级缓存
  开启两个session,分别调用query.iterate()查询普通属性

查询缓存只对query.list起作用,query.iterate不起作用,其实query.iterate不使用查询缓存

* 关闭查询缓存,关闭二级缓存
  开启两个session,分别调用query.list()查询实体对象
 
发出查询sql,因为query.list默认情况下,每次都会发出查询sql

* 打开查询缓存,关闭二级缓存
  开启两个session,分别调用query.list()查询实体对象

会发出n条查询语句,因为开启了查询缓存,关闭了二级缓存,而且是跨session查询
查询缓存会缓存实体对象的id,所以hibernate会根据实体对象的id加载相应的实体
如果缓存中存在则加载缓存中的数据,否则根据id发出相应的查询语句

* 打开查询缓存,开启二级缓存
  开启两个session,分别调用query.list()查询实体对象
 
不会发出查询sql,因为开启了二级缓存和查询缓存,查询缓存缓存了实体对象的id列表
hibernate会根据实体对象的id到二级缓存中取得相应的数据




Transient状态的对象的特性?
* 在数据库中没有与之匹配的记录
* 没有纳入session的管理

persistent状态的对象的特性?
* 纳入session的管理
* persistent状态的对象在数据库中存在与之匹配的数据
* persistent状态的对象在清理缓存(脏数据检查),会和数据库同步

detached状态的对象的特性?
* 在数据库中存在与之对应的记录
* 没有纳入session的管理

session.flush方法主要做两件事:
* 清理缓存
* 执行sql

session在什么情况下执行flush
* 默认在事务提交时
* 显示调用flush
* 在执行查询前,如:iterate

按照save(insert),update,delete顺序执行

豌豆代理(又称豌豆 IP)是一款一站式国内代理 IP 服务平台,主打高匿名、低延迟、高可用的 IP 资源,支持 HTTP/HTTPS/SOCKS5 协议,适配 Windows、Mac、Android、iOS 多平台。 多类型 IP 资源与高覆盖节点 提供动态住宅 IP、静态独享 IP、数据中心 IP,覆盖全国 200 + 城市,可用率 99%+;支持省市精准选择或全国混拨,适配不同业务合规与稳定性需求。 使用:在客户端 “节点 / 线路” 页,按城市 / 类型筛选,一键连接目标 IP,适合爬虫、电商多账号运营等场景。 秒级 IP 切换与灵活调度 支持手动一键切换、秒级动态切换(切换速度低至 100ms)、定时切换(自定义时长),并自动过滤重复 IP,避免重复使用导致风险。 使用:在 “设置” 中开启 “自动切换” 并设时间间隔,或按 Ctrl+Q 快捷键一键换 IP,适配反爬虫、批量测试等高频切换场景。 全协议支持与多端适配 兼容 HTTP/HTTPS/SOCKS5 主流代理协议,可对接浏览器、爬虫脚本、客户端软件;支持 Windows、Mac、安卓、iOS 多端同步使用,跨设备无缝切换。 使用:在客户端 “协议设置” 选择对应协议,生成代理地址与端口,直接填入目标软件即可生效。 隐私安全与数据加密 自研传输加密技术保护数据传输,搭配高匿名 IP 隐藏真实地址,同时支持自动清除 Cookie / 缓存,降低隐私泄露与追踪风险。 使用:在 “安全设置” 中开启 “数据加密” 与 “自动清理缓存”,公共 WiFi 环境下优先启用,提升隐私防护等级。 智能筛选与稳定网络优化 系统自动筛选低延迟、高可用 IP,过滤失效 / 重复地址;依托自建纯净机房与独享带宽,搭配 BGP 多线接入,保障连接稳定性与速度。 使用:无需手动配置,客户端默认智能匹配合适节点,复杂网络环境可在 “网络
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值