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>