Hibernate(6)- Hibernate配置文件(hibernate.cfg.xml)

£神魔★判官ぃ 2024-04-17 23:30 153阅读 0赞

1.Hibernate配置文件

  1. Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性
  2. 每个Hibernate配置文件对应一个Configuration对象
  3. Hibernate配置文件可以有两种格式:hibernate.properties 和 hibernate.cfg.xml

#

2.hibernate.cfg.xml的常用属性

  1. JDBC连接属性

    1. connection.driver_class:数据库JDBC驱动
    2. connection.url:数据库URL
    3. connection.username:数据库用户名
    4. connection.password:数据库用户密码
    5. dialect:配置数据库的方言,根据底层的数据库不同产生不同的语句,Hibernate会针对数据库的特性在访问时进行优化
  2. C3P0数据库连接池属性

    1. hibernate.c3p0.max_size:数据库连接池的最大连接数
    2. hibernate.c3p0.min_size:数据库连接池的最小连接数
    3. hibernate.c3p0.acquire_increment:当数据库连接池中的连接耗尽时,同一时刻获取多少个数据库连接
    4. hibernate.c3p0.timeout:数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
    5. hibernate.c3p0.idle_test_period:表示连接池检测线程多长时间检测一次池内的所有连接对象是否超时。连接池本身不会把自己从连接池中移除,而是专门有有一个线程按照一定的时间间隔来做这件事,这个线程通过比较连接对象最后一次被使用时间和当前时间差来和timeout做对比,进而决定是否销毁这个连接对象。
    6. hibernate.c3p0.max_statements:缓存Statement对象的数量
  3. 其他

    1. show_sql:是否将运行期生成的SQL输出到日志以供调试。取值true/fause
    2. format_sql:是否将SQL转化为格式良好的SQL。取值true/fause
    3. hbm2ddl.auto:在启动和停止时自动创建,更新或删除数据库模式。取值create/update/create-drop/validate
    4. connection.isolation:设置hibernate的事务隔离级别(Hibernate(4)- Session缓存)
    5. hibernate.jdbc.fetch_size
    6. hibernate.jdbc.batch_size

      1. <!-- 设定JDBC的Statement 读取数据的时候每次从数据库中取出的记录条数-->
      2. <property name="hibernate.jdbc.fetch_size">100</property>
      3. <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 -->
      4. <property name="hibernate.jdbc.batch_size">30</property>

三.练习:C3P0数据库连接池属性

  1. 第一步:导入jar包:E:\tolls\hibernate\hibernate-release-5.2.12.Final\lib\optional\c3p0
  2. 第二步:加入配置
    -hibernate.c3p0.max_size:数据库连接池的最大连接数
    -hibernate.c3p0.min_size:数据库连接池的最小连接数
    -hibernate.c3p0.acquire_increment:当数据库连接池中的连接耗尽时,同一时刻获取多少个数据库连接
    -hibernate.c3p0.timeout:数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁
    -hibernate.c3p0.idle_test_period:表示连接池检测线程多长时间检测一次池内的所有连接对象是否超时。连接池本身不会把自己从连接池中移除,而是专门有有一个线程按照一定的时间间隔来做这件事,这个线程通过比较连接对象最后一次被使用时间和当前时间差来和timeout做对比,进而决定是否销毁这个连接对象。
    -hibernate.c3p0.max_statements:缓存Statement对象的数量

4.hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size

1.说明

hibernate.jdbc.fetch_size

hibernate.jdbc.batch_size

这两个选项非常非常非常重要!!!将严重影响Hibernate的CRUD性能!

注意:在Oracle上,hibernate支持hibernate.jdbc.fetch_size和 hibernate.jdbc.batch_size,而MySQL却不支持,

2.Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。

例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会1次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。

因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。

这有点像平时我们写程序写硬盘文件一样,设立一个Buffer,每次写入Buffer,等Buffer满了以后,一次写入硬盘,道理相同。

Oracle数据库的JDBC驱动默认的Fetch Size=10,是一个非常保守的设定,根据我的测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。

因此我建议使用Oracle的一定要将Fetch Size设到50。

不过并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持。

MySQL就像我上面说的那种最坏的情况,他总是一下就把1万条记录完全取出来,内存消耗会非常非常惊人!这个情况就没有什么好办法了

3..Batch Size是设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。

Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。我做的一个测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!!!
我们通常不会直接操作一个对象的标识符(identifier), 因此标识符的setter方法应该被声明为私有的(private)。这样当一个对象被保存的时候,只有Hibernate可以为它分配标识符。 你会发现Hibernate可以直接访问被声明为public,private和protected等不同级别访问控制的方法(accessor method)和字段(field)。 所以选择哪种方式来访问属性是完全取决于你,你可以使你的选择与你的程序设计相吻合。

所有的持久类(persistent classes)都要求有无参的构造器(no-argument constructor); 因为Hibernate必须要使用Java反射机制(Reflection)来实例化对象。构造器(constructor)的访问控制可以是私有的(private), 然而当生成运行时代理(runtime proxy)的时候将要求使用至少是package级别的访问控制,这样在没有字节码编入 (bytecode instrumentation)的情况下,从持久化类里获取数据会更有效率一些。








hibernate.max_fetch_depth 设置外连接抓取树的最大深度

取值. 建议设置为0到3之间

就是每次你在查询时,会级联查询的深度,譬如你对关联vo设置了eager的话,如果fetch_depth值太小的话,会发多很多条sql

batch-size可以设定在Hbm的class 和 集合定义中. 开始我一直以为batch-size是获取child的数量, 其实真正获取的是parent的数量.

但是奇怪的是当我测试时 我把batch-size的值从1设置到5, 当设成1和2时其实每次获取的还是一个parent.当到3时就是同时获取3个parent.当多出select出来的parent时,感觉好像就没有规律了.我建议一般都把batch-size设成3。

发表评论

表情:
评论列表 (有 0 条评论,153人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Hibernate配置文件

    Hibernate的主配置文件,即hibernate.cfg.xml 主要包括三种配置: 1、数据库信息 2、导入映射配置文件 3、其它配置 配置数据库信息主要有:方言