關于資料庫連接配接池的使用,首先我們要明白我們為什麼要用它,對應普通的資料庫連接配接操作,通常會涉及到以下一些操作是比較耗時的:
網絡通訊,涉及到網絡延時及協定通訊
身份驗證,涉及安全性檢查
連接配接合法性檢查,主要是檢查所連接配接的資料庫是否存在
并發控制機制
構造并初始化輸出緩沖區
連接配接成功後的資訊儲存,日志存儲
伺服器性能
資料庫配置優化
系統配置設定記憶體資源
等等~~~狀況,導緻資料庫連接配接操作比較耗時,~~~而且每次都得花費0.05s~1s的時間
但是使用連接配接池技術,本質上就是在一個請求對應的連接配接,都由一個線程池來維護着,也就是說“上下文切換”的代價是線程級别(所謂的納秒級),對于大規模的并發通路,就算以每秒幾億級别的通路量都是不成問題的。
一、在Java平台
之前一段時間曾經弄過資料庫連接配接池,使用的是c3p0這個工具包,
簡單記錄下c3p0的使用,當作學習的一個鞏固;
第一步導入jar包;
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZwpmLmVzN2I2MkhDOxQzMjZjMhRTZ1QDZwMTM5cDM5gDOycTLxEDNwEjM0IzLcFDMzEDMy8CX5IzNyAzMvw1ZvxmYvwVbvNmLn9GbiRXauNmLzV2Zh1Wavw1LcpDc0RHaiojIsJye.jpg)
第二步:
把jar包導入進來:
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;
第三步:定義變量
package util;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;
public class DbUtil {
private static String url = "jdbc:mysql://localhost:3306/zdbang_net";
private static String user = "root";
private static String passwd = "admin";
private static String driver = "com.mysql.jdbc.Driver";
private ComboPooledDataSource cpds;
private static DbUtil db = new DbUtil();
public static DbUtil getInstance() {
return db;
}
private DbUtil() {
cpds = new ComboPooledDataSource();
try {
cpds.setDriverClass( driver);
cpds.setJdbcUrl( url );
cpds.setUser(user);
cpds.setPassword(passwd);
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(30);
cpds.setMaxIdleTime(60);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
public Connection getConn() {
try {
return cpds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
protected void finalize() throws Throwable {
DataSources.destroy(cpds);
super.finalize();
}
public static void closeConn(Connection conn) {
try {
if (conn != null)
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static Statement getStmt(Connection conn) {
Statement stmt = null;
try {
stmt = conn.createStatement();
return stmt;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void closeStmt(Statement stmt) {
try {
if (stmt != null)
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static PreparedStatement getPs(Connection conn, String sql) {
PreparedStatement ps = null;
try {
ps = conn.prepareStatement(sql);
return ps;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void closePs(PreparedStatement ps) {
try {
if (ps != null)
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static ResultSet doQuery(Statement stmt, String sql) {
try {
ResultSet rs = stmt.executeQuery(sql);
return rs;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void closeRs(ResultSet rs) {
try {
if (rs != null)
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ComboPooledDataSource API:
http://stderr.org/doc/libc3p0-java-doc/api/com/mchange/v2/c3p0/ComboPooledDataSource.html