hibernate学习第三天笔记
来源:互联网 发布:淘宝店铺收藏有用吗 编辑:程序博客网 时间:2024/06/05 03:25
一、对象的状态
举例: User user = new User();
Hibernate中对象的状态有三种: 临时/瞬时状态 、 持久化状态、游离状态
临时状态
特点: 01.直接new出来的对象; 02.不处于session的管理;03.数据库中没有对象的记录;
持久化状态
当调用session的save、saveOrUpdate/get/load/list等方法的时候,对象就是持久化状态。
处于持久化状态的对象,当对象的属性进行更改的时候,会反映到数据库中!
特点: 01.处于session的管理; 02.数据库中有对应的记录;
游离状态
特点: 01.不处于session的管理; 02.数据库有对应的记录; 03.是session关闭后,对象的状态
二、 一级缓存
为什么要用缓存?
目的: 减少对数据库的访问次数!从而提升hibernate的执行效率!
Hibernate中缓存分类: 一级缓存 和 二级缓存。
概念
1) Hibernate中一级缓存,也叫session缓存,它可以在session范围内减少数据库的访问次数! 只在session范围有效!Session关闭,一级缓存失效!
2) 当调用session的save/saveOrUpdate/get/load/list/iterator 方法的时候,都会把对象放入session的缓存中。
3) session的缓存由hibernate维护,用户不能操作缓存内容,如果想操作缓存内容,必须通过hibernate提供的evit/clear方法操作。
特点: 只在当前session范围内有效,作用时间短,效果不是特别明显! 在短时间内多次操作数据库,效果比较明显!
缓存相关几个方法的作用
session.flush(); 让一级缓存与数据库同步session.evict(); 清空一级缓存中指定的对象session.clear(); 清空一级缓存中缓存的所有对象
什么情况使用上面的方法:
批量操作时候使用:
Session.flush();//先与数据库同步
Session.clear();//再清空一级缓存
面试题1: 不同的session是否共享缓存数据?
答: 不会,不同的session对象使用不同的缓冲区
面试题2: list与iterator查询的区别?
答: list()方法 : 会一次性把所有记录都查出来,会放入缓存,但不会从缓存中获取数据。
iterator() 方法: 会执行N+1条查询,N表示所有的记录总数。 即会先发送一条语句查询所有记录的主键(1),再根据每一 个主键再去数据库查询(N)。会放入缓存,也会从缓存中获取数据!
三、懒加载
面试题3: get、load方法的区别?
答:get:及时加载,只要调用get方法立即向数据库查询。 load:默认懒加载,用到数据的时候才向数据库查询
懒加载的概念: 当用到数据的时候才想数据库查询,这就是hibernate的懒加载特性。
懒加载的目的: 提供程序执行效率!
配置可选值:
- true : 使用懒加载
- false: 关闭懒加载
- extra: (在集合数据懒加载时候提升效率)在真正使用数据的时候才向数据库发送查询的sql;如果调用集合的size()/isEmpty()方法,只是统计,不是真正查询数据!
懒加载异常:
- session关闭后,不能使用懒加载数据!
- 如果session关闭后,使用懒加载数据报错:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
如何解决session关闭后不能使用懒加载数据问题?
- 方式一: 先使用一下数据: 如dept.getName();
- 方式二: 强迫代理对象初始化: Hibernate.initialize(dept);
- 方式三: 关闭懒加载: 设置 lazy = false;
- 方式四: 在使用数据后,再关闭session。
四、hibernate对连接池的支持
连接池: 管理连接,提升连接的利用效率!
常用的连接池: c3p0连接池
Hibernate 自带也有一个连接池,且对c3p0也有支持!
01. hibernate.properties文件查看连接池详细配置:
- hibernate.c3p0.max_size 2 最大连接数
- hibernate.c3p0.min_size 2 最小连接数
- hibernate.c3p0.timeout 5000 超时时间
- hibernate.c3p0.max_statements 100 最大执行的命令的个数
- hibernate.c3p0.idle_test_period 3000 空闲测试时间
- hibernate.c3p0.acquire_increment 2 连接不够用的时候, 每次增加的连接数
02. 告诉hibernate使用哪一个连接池技术:
hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
示例:
<!-- 【连接池配置】 --> <!-- 配置连接驱动管理类 --> <property name="hibernate.connection.provider_class"> org.hibernate.connection.C3P0ConnectionProvider </property> <!-- 配置连接池参数信息 --> <property name="hibernate.c3p0.min_size">2</property> <property name="hibernate.c3p0.max_size">4</property> <property name="hibernate.c3p0.timeout">5000</property> <property name="hibernate.c3p0.max_statements">10</property> <property name="hibernate.c3p0.idle_test_period">30000</property> <property name="hibernate.c3p0.acquire_increment">2</property>
- hibernate学习第三天笔记
- hibernate学习笔记第三天(1)
- hibernate学习笔记第三天(2)
- Hibernate学习笔记(第三天)
- Hibernate学习第三天
- 第三天学习笔记
- 第三天学习笔记
- 学习笔记第三天
- hibernate 学习笔记(马士兵教程) 第三天
- Css 学习笔记第三天
- Struts学习笔记第三天
- Android学习笔记: 第三天
- java学习笔记--第三天
- liunx学习第三天笔记
- Java学习第三天笔记
- JSP学习笔记(第三天)
- processing第三天学习笔记
- JAVA学习第三天笔记
- redis基础
- Log4j日志框架的使用
- Jemeter 测试存储过程的并发调用
- 获取手机品牌工具类
- 想入门深度学习?先理解这25个概念!
- hibernate学习第三天笔记
- Could not delete .........May be locked by another process.
- Linux虚拟机之间免密登录的实现
- 完整的C++ 静态单例代码(带互斥量Mutex)
- 电池电量分析
- 树
- 在做修改密码的 输入空格 是禁止的 EditText禁止输入空格 和 换行
- pm2
- Vue 学习