首先看一个简的 hibernate.cfg.xml 单配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- MySQL 数据库基本配置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate_db?useUnicode=true&characterEncoding=UTF-8</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 配置MySQL 方言 -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<!-- 配置是否显示SQL 语句 -->
<property name="show_sql">true</property>
<!-- 配置SQL语句格式化显示 -->
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<!-- 删除对象后,使 session 中的对象 OID 为 null -->
<property name="hibernate.use_identifier_rollback">true</property>
<!-- c3p0 配置 -->
<!-- 设置最大链接数 -->
<property name="hibernate.c3p0.max_size">200</property>
<!-- 设置最小链接数 -->
<property name="hibernate.c3p0.min_size">10</property>
<!-- 当数据库连接池中的连接耗尽时, 同一时刻获取多少个数据库连接 -->
<property name="hibernate.c3p0.acquire_increment">10</property>
<!-- 缓存 Statement 对象的数量 -->
<property name="hibernate.c3p0.max_statements">5</property>
<!-- 连接池检测线程多长时间检测一次 -->
<property name="hibernate.c3p0.idle_test_period">2000</property>
<!-- 数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁 -->
<property name="hibernate.c3p0.timeout">2000</property>
<!-- 指定关联的 hbm.xml -->
<mapping resource="com/cfox/hibernate/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
下面就以上面这个简单的为例,对 hibernate.cfg.xml 的常用属性进行说明:
数据库配置()
- JDBC 连接属性
- connection.url:数据库URL
- connection.username:数据库用户名
- connection.password:数据库用户密码
- connection.driver_class:数据库JDBC驱动
<!-- 配置数据库链接 -->
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://127.0.0.1:3306/hibernate_db?useUnicode=true&characterEncoding=UTF-8</property>
方言(dialect)
dialect:配置数据库的方言,根据底层的数据库不同产生不同的 sql 语句,Hibernate 会针对数据库的特性在访问时进行优化
方言在 hibernate-release-5.1.10.Final\hibernate-release-5.1.10.Final\project\etc\文件夹下hibernate.properties 文件中,里面有各种数据库的方言。
<!-- 设置方言 -->
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
show_sql
是否将运行期生成的SQL输出到日志以供调试。取值 true | false
<!-- 是否在控制台打印SQL -->
<property name="show_sql">true</property>
format_sql
是否将 SQL 转化为格式良好的 SQL . 取值 true | false
<!-- 是否对SQL 进行格式化 -->
<property name="format_sql">true</property>
hbm2ddl.auto: 该属性可帮助程序员实现正向工程, 即由 java 代码生成数据库脚本, 进而生成具体的表结构 。
取值 create | update | create-drop | validate
- create : 会根据 .hbm.xml 文件来生成数据表, 但是每次运行都会删除上一次的表 ,重新生成表, 哪怕二次没有任何改变
- create-drop : 会根据 .hbm.xml 文件生成表,但是SessionFactory一关闭, 表就自动删除
- update : 最常用的属性值,也会根据 .hbm.xml 文件生成表, 但若 .hbm.xml 文件和数据库中对应的数据表的表结构不同, Hiberante 将更新数据表结构,但不会删除已有的行和列
- validate : 会和数据库中的表进行比较, 若 .hbm.xml 文件中的列在数据表中不存在,则抛出异常
<!-- 指定自动生成数据库的策略 -->
<property name="hbm2ddl.auto">update</property>
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: 当数据库连接池中的连接耗尽时, 同一时刻获取多少个数据库连接
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 的时候比较合适。