Hibernate hibernate.cfg.xml


下面对hibernate.cfg.xml配置进行分析。

<?xml version='1.0' encoding='utf-8'?>  
<!DOCTYPE hibernate-configuration PUBLIC  
        "-//Hibernate/Hibernate Configuration DTD//EN"  
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">  
<hibernate-configuration>  
    <session-factory>  
        <!-- 配置连接数据库的基本信息 jdbc:mysql://localhost:3306/hibernate-->  
        <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>  
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>  
  
        <property name="connection.username">root</property>  
        <property name="connection.password">root</property>  
  
        <!-- 配置 hibernate 的基本信息 -->  
        <!--所使用的数据库方言 MySQL5Dialect-->  
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <!-- 执行操作时是否在控制台打印 SQL -->  
        <property name="show_sql">true</property>  
        <!-- 是否对 SQL 进行格式化,例如语句显示会换行 -->  
        <property name="format_sql">true</property>  
        <!-- 指定自动生成数据表的策略 -->  
        <property name="hbm2ddl.auto">update</property>  
  
  
        <!-- 配置 C3P0 数据源-->  
        <!--数据库连接池的最大连接数-->  
        <property name="hibernate.c3p0.max_size">10</property>  
        <!--数据库连接池的最小连接数-->  
        <property name="hibernate.c3p0.min_size">5</property>  
        <!--当数据库连接池中的连接耗尽时, 同一时刻获取多少个数据库连接-->  
        <property name="c3p0.acquire_increment">2</property>  
        <!--表示连接池检测线程多长时间检测一次池内的所有链接对象是否超时.  
        连接池本身不会把自己从连接池中移除,而是专门有一个线程按照一定的时间间隔来做这件事,  
        这个线程通过比较连接对象最后一次被使用时间和当前时间的时间差来和 timeout 做对比,进而决定是否销毁这个连接对象。-->  
        <property name="c3p0.idle_test_period">2000</property>  
        <!--数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁-->  
        <property name="c3p0.timeout">2000</property>  
        <!--缓存 Statement 对象的数量-->  
        <property name="c3p0.max_statements">10</property>  
  
  
        <!-- 设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数 ,取100最好-->  
        <property name="hibernate.jdbc.fetch_size">100</property>  
        <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 取20合适-->  
        <property name="jdbc.batch_size">30</property>  
  
        <mapping resource="com/yiidian/domain/Customer.hbm.xml"/> 
    
    </session-factory>  
</hibernate-configuration>  

一、hibernate.cfg.xml配置格式

Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性
每个 Hibernate 配置文件对应一个 Configuration 对象

Hibernate配置文件可以有两种格式:
    - hibernate.properties(不推荐)
    - hibernate.cfg.xml (推荐)

二、hibernate.cfg.xml的常用属性

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

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

  - show_sql:是否将运行期生成的SQL输出到日志以供调试。取值 true | false
  - format_sql:是否将 SQL 转化为格式良好的 SQL . 取值 true | false
  - hbm2ddl.auto:在启动和停止时自动地创建,更新或删除数据库模式。取值 create | update | create-drop | validate
  - hibernate.jdbc.fetch_size
  - hibernate.jdbc.batch_size

3)jdbc.fetch_size 和 jdbc.batch_size
  hibernate.jdbc.fetch_size:实质是调用 Statement.setFetchSize() 方法设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数。
  - 例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会 1 次性把1万条取出来的,而只会取出 fetchSize 条数,当结果集遍历完了这些记录以后,再去数据库取 fetchSize 条数据。因此大大节省了无谓的内存消耗。Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的次数越多,速度越慢。Oracle数据库的JDBC驱动默认的Fetch Size = 10,是一个保守的设定,根据测试,当Fetch Size=50时,性能会提升1倍之多,当 fetchSize=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持

  hibernate.jdbc.batch_size:设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小,类似于设置缓冲区大小的意思。batchSize 越大,批量操作时向数据库发送sql的次数越少,速度就越快。
  - 测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!Oracle数据库batchSize=30 的时候比较合适。