05-hibernate之配置c3p0數據源

1、導入c3p0的jar包

hibernate-release-4.3.11.Final/lib/optional/c3p0/*.jar

2、加入配置

  • 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: 當數據庫連接池中的連接耗盡時, 同一時刻獲取多少個數據庫連接
 <!--配置c3p0數據源-->
<!--數據庫連接池的最大連接數-->
<property name="hibernate.c3p0.max_size">10</property>
<!--數據庫連接池的最小連接數-->
<property name="hibernate.c3p0.min_size">5</property>
<!--當數據庫連接池中的連接耗盡時,同一時刻獲取多少個數據庫連接-->
<property name="hibernate.c3p0.acquire_increment">2</property>

<!--表示連接池檢測線程多長時間檢測一次池內的所有連接對象是否超時-->
<property name="hibernate.c3p0.idle_test_period">2000</property>
<!--數據庫連接池中連接對象在多長時間沒有使用過後,就應該被銷燬-->
<property name="hibernate.c3p0.timeout">2000</property>   
  
<!--緩存Statement對象的數量-->
<property name="hibernate.c3p0.max_statements">2</property>  

========================================================

  • 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 的時候比較合適。
 <!--設定jdbc的Statement讀取數據的時候每次從數據庫中取出的記錄條數。MySQL不支持-->
<property name="hibernate.jdbc.fetch_size">100</property>
<!--設定對數據庫進行批量刪除,批量更新和批量插入的時候的批次大小-->
<property name="hibernate.jdbc.batch_size">50</property>

代碼測試:

在這裏插入圖片描述
hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
                "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
                "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
    <!-- 配置數據庫信息 -->
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql:///hibernate_db</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>

    <!-- 配置hibernate信息 -->
    <!--執行操作時是否在控制檯打印sql-->
    <property name="hibernate.show_sql">true</property>
    <!--是否對sql進行格式化-->
    <property name="hibernare.format_sql">true</property>
    <!--指定自動生成數據表的策略-->
    <property name="hibernate.hbm2ddl.auto">update</property>
    <!-- 設置hibernate所使用的數據庫方言 -->
    <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
    <!--刪除對象後,使其OID置爲null-->
    <property name="hibernate.use_identifier_rollback">true</property>

    <!--配置c3p0數據源-->
    <!--數據庫連接池的最大連接數-->
    <property name="hibernate.c3p0.max_size">10</property>
    <!--數據庫連接池的最小連接數-->
    <property name="hibernate.c3p0.min_size">5</property>
    <!--當數據庫連接池中的連接耗盡時,同一時刻獲取多少個數據庫連接-->
    <property name="hibernate.c3p0.acquire_increment">2</property>

    <!--表示連接池檢測線程多長時間檢測一次池內的所有連接對象是否超時-->
    <property name="hibernate.c3p0.idle_test_period">2000</property>
    <!--數據庫連接池中連接對象在多長時間沒有使用過後,就應該被銷燬-->
    <property name="hibernate.c3p0.timeout">2000</property>

    <!--緩存Statement對象的數量-->
    <property name="hibernate.c3p0.max_statements">2</property>
    

    <!-- 指定關聯的hibernate映射文件 -->
    <mapping resource="com/zm/c3p0/news.hbm.xml"/>
</session-factory>
</hibernate-configuration>

news.hbm.xml:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <class name="com.zm.c3p0.News" table="news" schema="hibernate_db" select-before-update="true">
        <id name="id" type="java.lang.Integer">
            <column name="id" sql-type="int(11)"/>
            <!-- 主鍵的生成方式 -->
            <generator class="native"></generator>
        </id>
        <property name="title" type="java.lang.String">
            <column name="title" sql-type="varchar(255)"/>
        </property>
        <property name="auth" type="java.lang.String">
            <column name="auth" sql-type="varchar(255)"/>
        </property>
        <property name="desc" type="java.lang.String">
            <column name="desc" sql-type="varchar(255)"/>
        </property>
    </class>
</hibernate-mapping>

News:

public class News {
    private int id;
    private String title;
    private String auth;
    private String desc;

    public News() {
    }

    public News(String title, String auth) {
        this.id = id;
        this.title = title;
        this.auth = auth;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuth() {
        return auth;
    }

    public void setAuth(String auth) {
        this.auth = auth;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "News{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", auth='" + auth + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

測試:

public class HibernateC3p0Test {
    private SessionFactory sessionFactory;
    private Session session;
    private Transaction transaction;

    @Before
    public void init(){
        Configuration configuration = new Configuration().configure();
        //4.3.x  創建sessionFactory對象
        ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
        sessionFactory = configuration.buildSessionFactory(serviceRegistry);
        //創建session對象
        session = sessionFactory.openSession();
        transaction = session.beginTransaction();
    }

    @After
    public void destory(){
        transaction.commit();
        session.close();
        sessionFactory.close();
    }

    @Test
    public void testDoWork(){
       session.doWork(new Work() {
           @Override
           public void execute(Connection connection) throws SQLException {
               System.out.println(connection);
           }
       });
    }
}

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章