Hibernate主配置文件

2019-04-20  本文已影响0人  聂叼叼

Hibernate配置文件

一、简介

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

Hibernate配置文件可以有两种格式:

1、hibernate.properties
2、hibernate.cfg.xml

注意:

hibernate.cfg.xml这个名字是主配置文件默认的,下面来解析下,上面讲Hibernate主配置文件对应一个Configuration对象,来看一下怎么创建这个Configuration对象?

//创建配置对象(读取配置文档)
Configuration config = new Configuration().configure();

上面的Configuration对象调用configure()方法就可以找到hibernate.cfg.xml这个文件(在类路径下),这个方法没有传参其内部调用的是有参的。如下:

public Configuration configure() throws HibernateException {
        return configure( StandardServiceRegistryBuilder.DEFAULT_CFG_RESOURCE_NAME );
    }

上面StandardServiceRegistryBuilder.DEFAULT_CFG_RESOURCE_NAME是个什么常量呢?来看一下源码里怎么定义这个常量的?

public static final String DEFAULT_CFG_RESOURCE_NAME = "hibernate.cfg.xml";

默认是取hibernate.cfg.xml这个名字的文件。

调用有参的configure()方法,来看一下有参的configure()方法。

public Configuration configure(String resource) throws HibernateException {
        standardServiceRegistryBuilder.configure( resource );
        // todo : still need to have StandardServiceRegistryBuilder handle the "other cfg.xml" elements.
        //      currently it just reads the config properties
        properties.putAll( standardServiceRegistryBuilder.getSettings() );
        return this;
    }

以上的源码都在StandardServiceRegistryBuilder这个类中,可以进去详看。

二、比较完整的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>
        
        <!-- Hibernate 连接数据库的基本信息 -->
        <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:///hibernate</property>

        <!-- Hibernate 的基本配置 -->
        <!-- Hibernate 使用的数据库方言 -->
        <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>
        
        <!-- 设置 Hibernate 的事务隔离级别 -->
        <property name="connection.isolation">2</property>
        
        <!-- 删除对象后, 使其 OID 置为 null -->
        <property name="use_identifier_rollback">true</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>
        
        <property name="c3p0.idle_test_period">2000</property>
        <property name="c3p0.timeout">2000</property>
        
        <property name="c3p0.max_statements">10</property>
        
        <!-- 设定 JDBC 的 Statement 读取数据的时候每次从数据库中取出的记录条数 -->
        <property name="hibernate.jdbc.fetch_size">100</property>
        
        <!-- 设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小 -->
        <property name="jdbc.batch_size">30</property>
        
        <!-- 指定关联的 .hbm.xml 文件 -->
        <mapping resource="com/nieshenkuan/bean/User.hbm.xml"/> 
        <mapping resource="com/nieshenkuan/bean/News.hbm.xml"/> 
        <!-- 基于annotation的配置 -->
        <mapping class="com.nieshenkuan.bean.AnoUser"/>
    </session-factory>

</hibernate-configuration>

三、对以上一些信息详解

1、JDBC 连接属性

        <!-- Hibernate 连接数据库的基本信息 -->
        <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:///hibernate</property>

        <!-- Hibernate 的基本配置 -->
        <!-- Hibernate 使用的数据库方言 -->
        <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

2、C3P0 数据库连接池属性

这里使用c3p0的数据库连接池是hibernate推荐使用这个,具体的也可以与其他数据库连接池相结合。

        <!-- 配置 C3P0 数据源 -->
        <property name="hibernate.c3p0.max_size">10</property>
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="c3p0.acquire_increment">2</property>
        
        <property name="c3p0.idle_test_period">2000</property>
        <property name="c3p0.timeout">2000</property>
        
        <property name="c3p0.max_statements">10</property>

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 的时候比较合适。

        <!-- 运行时是否打印 SQL -->
        <property name="show_sql">true</property>
    
        <!-- 运行时是否格式化 SQL -->
        <property name="format_sql">true</property>
    
        <!-- 生成数据表的策略 -->
        <property name="hbm2ddl.auto">update</property>
        
        <!-- 设置 Hibernate 的事务隔离级别 -->
        <property name="connection.isolation">2</property>
        
        <!-- 删除对象后, 使其 OID 置为 null -->
        <property name="use_identifier_rollback">true</property>

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

4、添加映射文件或者映射类(注解)

<!-- 指定关联的 .hbm.xml 文件 -->
        <mapping resource="com/nieshenkuan/bean/User.hbm.xml"/> 
        <mapping resource="com/nieshenkuan/bean/News.hbm.xml"/> 
        <!-- 基于annotation的配置 -->
        <mapping class="com.nieshenkuan.bean.AnoUser"/>
上一篇 下一篇

猜你喜欢

热点阅读