天天看點

Hibernate - hibernate.cfg.xml配置檔案詳解

Hibernate 配置檔案主要用于配置資料庫連接配接和 Hibernate 運作時所需的各種屬性。每個 Hibernate 配置檔案對應一個 Configuration 對象–這樣說不太正确,應該是項目初始化時會執行個體化Configuration對象,該執行個體對象(Configuration對象)會讀取配置檔案配置的屬性值為執行個體對象指派。

Hibernate配置檔案可以有兩種格式:

  • hibernate.properties
  • 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">123456</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>
        
        <!-- 需要關聯的 hibernate 映射檔案 .hbm.xml -->
        <mapping resource="com/**/Customer.hbm.xml"/>
        <mapping resource="com/**//Order.hbm.xml"/>
    

    </session-factory>

</hibernate-configuration>      

【1】JDBC 連接配接屬性

connection.url:資料庫URL 。

connection.username:資料庫使用者名。

connection.password:資料庫使用者密碼 。

connection.driver_class:資料庫JDBC驅動 。

dialect:配置資料庫的方言,根據底層的資料庫不同産生不同的 sql 語句,Hibernate 會針對資料庫的特性在通路時進行優化。

如下所示,Hibernate連接配接Oracle:

<!-- Hibernate 連接配接資料庫的基本資訊 -->
<property name="connection.username">scott</property>
<property name="connection.password">123456</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>

<!-- Hibernate 的基本配置 -->
<!-- Hibernate 使用的資料庫方言 -->
<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>      

【2】C3P0 資料庫連接配接池屬性

使用maven引入hibernate整合C3P0需要的jar:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>${hibernate.version}</version>
</dependency>      

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: 當資料庫連接配接池中的連接配接耗盡時, 同一時刻擷取多少個資料庫連接配接。

實際項目中,通常使用Druid資料源。

【3】Hibernate基本配置

show_sql:是否将運作期生成的SQL輸出到日志以供調試。取值 true | false 。

format_sql:是否将 SQL 轉化為格式良好的 SQL . 取值 true | false。

hbm2ddl.auto:在啟動和停止時自動地建立,更新或删除資料庫模式。取值 create | update | create-drop | validate。

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 的時候比較合适。

【4】hibernate.cfg.xml中的hbm2ddl.auto

該屬性可幫助程式員實作正向工程, 即由 java 代碼生成資料庫腳本, 進而生成具體的表結構 。取值 ​

​create | update | create-drop | validate​

​。

① create

會根據*.hbm.xml 檔案來生成資料表, 但是每次運作都會删除上一次的表 ,重新生成表, 哪怕二次沒有任何改變 。

② create-drop

會根據 *.hbm.xml 檔案生成表,但是SessionFactory一關閉, 表就自動删除 。

③ update

最常用的屬性值,也會根據 *.hbm.xml 檔案生成表。但若 .hbm.xml 檔案和資料庫中對應的資料表的表結構不同, Hiberante 将更新資料表結構,但不會删除已有的行和列。