用idea配置c3p0連線池

米奇羅發表於2019-03-23

前言

上次利用c3p0封裝了資料庫操作工具類,但沒有用到連線池,在處理大資料量訪問的時候那種方法事不好的,最好使用連線池,本文將配置連線池的原始碼貼出。

1. 準備

下載的包均是此時最新包

2. c3p0連線池配置

  • 新增依賴

將包匯入,並新增依賴。如下圖操作即可

匯入包

  • 建立c3p0-config.xml

在src資料夾下建立c3p0-config.xml,檔名不能改,只能是這個。 配置原始碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <!-- This is default config! -->
    <default-config>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </default-config>

    <!-- This is my config for mysql-->
    <named-config name="mysql">
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/bigtest?serverTimezone=GMT</property>
        <!--MySQL賬戶密碼-->
        <property name="user">root</property>
        <property name="password">rootroot</property>
        <!-- 初始化連線池中的連線數,取值應在minPoolSize與maxPoolSize之間,預設為3-->
        <property name="initialPoolSize">10</property>
        <!--最大空閒時間,60秒內未使用則連線被丟棄。若為0則永不丟棄。預設值: 0 -->
        <property name="maxIdleTime">30</property>
        <!--連線池中保留的最大連線數。預設值: 15 -->
        <property name="maxPoolSize">100</property>
        <!-- 連線池中保留的最小連線數,預設為:3-->
        <property name="minPoolSize">10</property>
        <!--c3p0全域性的PreparedStatements快取的大小。如果maxStatements與maxStatementsPerConnection均為0,則快取不生效,只要有一個不為0,則語句的快取就能生效。如果預設值: 0-->
        <property name="maxStatements">200</property>
        <!-- 當連線池連線耗盡時,客戶端呼叫getConnection()後等待獲取新連線的時間,超時後將丟擲SQLException,如設為0則無限期等待。單位毫秒。預設: 0 -->

        <!--這種寫法也可以
        <property name="checkoutTimeout" value="3000"/>
        -->
        <property name="checkoutTimeout">3000</property>
        <!--當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。預設值: 3 -->
        <!--
        <property name="acquireIncrement" value="2"/>
        -->
        <property name="acquireIncrement">2</property>
        <!--定義在從資料庫獲取新連線失敗後重復嘗試的次數。預設值: 30 ;小於等於0表示無限次-->
        <!--
        <property name="acquireRetryAttempts" value="0"/>
        -->
        <property name="acquireRetryAttempts">0</property>
        <!--重新嘗試的時間間隔,預設為:1000毫秒-->
        <!--
        <property name="acquireRetryDelay" value="1000" />
        -->
        <property name="acquireRetryDelay">1000</property>
        <!--關閉連線時,是否提交未提交的事務,預設為false,即關閉連線,回滾未提交的事務 -->
        <property name="autoCommitOnClose">false</property>
        <!--c3p0將建一張名為Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個引數那麼屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操作,它將只供c3p0測試使用。預設值: null -->
        <property name="automaticTestTable">Test</property>
        <!--如果為false,則獲取連線失敗將會引起所有等待連線池來獲取連線的執行緒丟擲異常,但是資料來源仍有效保留,並在下次呼叫getConnection()的時候繼續嘗試獲取連線。如果設為true,那麼在嘗試獲取連線失敗後該資料來源將申明已斷開並永久關閉。預設: false-->
        <property name="breakAfterAcquireFailure">false</property>
        <!--每60秒檢查所有連線池中的空閒連線。預設值: 0,不檢查 -->
        <property name="idleConnectionTestPeriod">60</property>
        <!--maxStatementsPerConnection定義了連線池內單個連線所擁有的最大快取statements數。預設值: 0 -->
        <property name="maxStatementsPerConnection">200</property>
    </named-config>


    <!-- This is my config for oracle
    <named-config name="oracle">
        <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
        <property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>
        <property name="user">scott</property>
        <property name="password">liang</property>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </named-config>
    -->
</c3p0-config>

複製程式碼

3. JDBC連線

建立JDBCUtil.java 原始碼如下:

package com.maolin;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;

public class JDBCUtil {

    private static DataSource dataSource=null;
    static{
        dataSource=new ComboPooledDataSource("mysql");
    }

    /**
     * 獲取資料庫連線
     * @return
     */
    public static Connection getConnection(){
        Connection conn=null;
        try {
            conn=dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }


    /**
     * 關閉資料庫連線
     * @param conn
     */
    public static void closeConn(Connection conn){
        try {
            if(conn!=null && conn.isClosed()){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

複製程式碼

4. 測試

測試:TestJdbc.java

package com.maolin;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.maolin.JDBCUtil;

public class TestJdbc {
public static void main(String[] args){
        Connection conn=JDBCUtil.getConnection();
        System.out.println(conn);
        try {
            PreparedStatement stmt=conn.prepareStatement("select * from member");
            ResultSet re=stmt.executeQuery();
            while(re.next()){
                String name=re.getString(3);
                System.out.println(name);
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

複製程式碼

5. 小結

雖然這個看起來不難,但如果不仔細研究,最後還是弄不出來,差點就放棄了,不過最後還是弄出來了,蠻開心的。 C3P0是一個開源的JDBC連線池,它實現了資料來源和JNDI繫結,支援JDBC3規範和JDBC2的標準擴充套件。目前使用它的開源專案有Hibernate,Spring等。

相關文章