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