數據庫連接池-C3P0

1) 使用數據庫連接池的原因:

• 傳統方式創建和銷燬連接都需要消耗系統資源
• 傳統方式創建和銷燬連接都需要消耗時間

2) 使用數據庫連接池的目的:

• 爲了複用連接,代替傳統的頻繁佔用系統資源和耗費時間的方式
• 便於管理連接,可以規定最大的連接數(控制應用服務器對數據庫的併發訪問)

我們可以通過鏈表,實現自己的連接池。

public class PersonalConnectionPool {

/**
 * 用戶名
 */
private static String user;
/**
 * 密碼
 */
private static String password;
/**
 * 連接數據庫的URL
 */
private static String url;


/**
 * 連接池
 * 規定最大連接數爲3
 */
private static LinkedList<Connection> pool;

/**
 * 從屬性文件中加載數據庫驅動,初始化連接池
 */
static{
    try {
        Properties properties = new Properties();
        pool = new LinkedList<Connection>();
        Class.forName("com.mysql.jdbc.Driver");
        ClassLoader classLoader = PersonalConnectionPool.class.getClassLoader();
        InputStream iStream = classLoader.getResourceAsStream("mysqlCongfig.properties");
        properties.load(iStream);
        user = properties.getProperty("user");
        password = properties.getProperty("password");
        url = properties.getProperty("url");
        //創建三個連接對象(包裝類對象)放到池子中
        for (int i = 0; i < 3; i++) {
            Connection connection = DriverManager.getConnection(url, user, password);
            Connection connectionWrapper = new ConnectionWapper(connection,pool);
            pool.add(connectionWrapper);
        }

    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}


/**
 * @throws SQLException 
 * @method 向外提供連接對象
 */
public Connection getConnection() throws SQLException {

    Connection connection;
    if(pool.size()>0)
    {
        connection = pool.removeFirst();
    }
    else
    {
        //等待超時,返回一個新創建的對象
        connection = DriverManager.getConnection(url, user, password);
    }
    System.out.println("當前池子中有  "+pool.size()+" 個對象");
    return connection;
}

/**
 * 歸還連接對象
 * 直接簡化在包裝類的close方法中
 */
}

但是基於統一,JAVA爲數據庫連接池提供了公共接口,要求所有項目開發的連接池必須實現DataSource接口,可一統一用一套接口的方法使用不同開發商的數據庫連接池。

3) 主流的連接池有:

(1)C3p0
(2)dbcp
(3)Tomcat jdbc pool
(4)BoneCP
(5)Druid

4) C3P0連接池示例代碼:

(0)需要導入c3p0-0.9.1.2.jar
(1)C3P0連接池代碼

package com.ambow.pool;
/*
 * C3P0連接池
 */

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class C3P0Util {
	//1.創建連接池對象
	static DataSource c3p0Pool;
	static {
		c3p0Pool = new ComboPooledDataSource();
	}
	
	//2.獲取數據庫連接(從連接池中獲取)
	public static Connection getConnection() {
		Connection conn = null;
		try {
			conn = c3p0Pool.getConnection();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return conn;
	}
	//3.關閉連接,釋放資源
	public static void closeAll(Connection conn,Statement stmt,ResultSet rs) {
		try {
			if (rs != null) {
				rs.close();
			}
			if (stmt != null) {
				stmt.close();
			}
			if (conn != null) {
				conn.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	//4.獲取連接池
	public static DataSource getPool() {
		return c3p0Pool;
	}
}

(2)C3P0配置文件【方式一】c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>  
    <default-config>  
        <property name="driverClass">com.mysql.jdbc.Driver</property>  
        <property name="user">root</property>  
        <property name="password">root</property>  
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/studb</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>   
    </default-config>  
</c3p0-config>

(3)C3P0配置文件【方式二】c3p0.properties

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/studb?useUnicode=true&characterEncoding=UTF-8
c3p0.user=root
c3p0.password=root

c3p0.maxPoolSize=20
c3p0.minPoolSize=2
c3p0.initialPoolSize=5
c3p0.maxStatements=30
c3p0.maxIdleTime=100

參考資料:
JDBC連接池的基本原理及實現方式:
https://blog.csdn.net/u010028461/article/details/78932109
C3P0連接池使用教程
https://www.cnblogs.com/ygj0930/p/6405861.html
主流Java數據庫連接池比較與開發配置實戰
https://blog.csdn.net/fysuccess/article/details/66972554

jar包下載地址:
https://sourceforge.net/projects/c3p0/
http://www.java2s.com/Code/Jar/c/Downloadc3p0jar.htm

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