在Java中使用的主流連接池包括C3P0、BONCP、DBCP、Proxool…,最多人用的是C3P0,因爲除了不提供連接池監控,配置簡單,持續運行的穩定性很不錯
爲什麼使用連接池
在開發中, 頻繁的開關連接是一件非常消耗資源和時間的操作, 會導致程序執行的效率非常的低下,創建連接要花的時時間一般比對數據庫的數據增刪改查的時間還要長! 因此我們可以在程序中創建容器(連接池), 在程序啓動時就初始化一批連接放在連接池中, 當用戶需要時,就從連接池中獲取一個連接, 用完連接之後再將連接還回連接池中, 這樣就可以實現連接的複用, 減少連接開關的次數, 提高程序執行的效率!!
連接池的使用及創建步驟:
1,導入jar包c3p0,以及mysql連接驅動
<!-- MySQL驅動 -->
<!-- mysql-connector-java-5.1.43-bin.jar -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.43</version>
</dependency>
<!-- mchange C3P0 數據源 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5-pre2</version>
</dependency>
2,編寫property配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/XXX</property>
<property name="user">XXX</property>
<property name="password">XXX</property>
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</property>
</default-config>
<!--自定義配置增加鍵name 提供多選擇 -->
<named-config name="awcDB">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/XXX</property>
<property name="user">XXX</property>
<property name="password">XXX</property>
<property name="initialPoolSize">10</property>
<property name="maxPoolSize">20</property>
</named-config>
</c3p0-config>
3, 編寫c3p0工具類 c3p0Util
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class c3p0Util {
// 這裏不傳入參數則會使用默認配置
private static ComboPooledDataSource dataSource = new ComboPooledDataSource("awcDB");
// 返回一個dataSource連接
public static ComboPooledDataSource getDataSource(){
return dataSource;
}
// 返回一個Connection連接
public static Connection getConnection() throws SQLException{
return dataSource.getConnection();
}
/**
* 釋放資源
* @param conn
* @param pstmt
* @param rs
*/
public static void release(Connection conn, Statement pstmt, ResultSet rs){
// 關閉數據庫連接對象
if(conn!=null){
try {
if(!conn.isClosed()){
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 關閉數據庫操作對象
if (pstmt!=null) {
try {
pstmt.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//關閉結果集對象
if (rs!=null) {
try {
rs.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
4,使用
private void warehousing(Data data) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1,使用c3p0連接池
conn = c3p0Util.getConnection();
// 2,獲取數據庫操作對象
stmt = conn.createStatement();
// 3,改爲手動提交
conn.setAutoCommit(false);
String sqlcunru = "insert into keynote2"
+ " (name,count,deal"
+ ",createTime,price) values ('"+data.getName()+"','"+data.getCount()+"','"+data.getDeal()+"','"+data.getCreateTime()+"','"+data.getPrice()+"')";
// 4,得到結果集
stmt.execute(sqlcunru);
// 5,提交
conn.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 6,關閉對象,回收數據庫資源
c3p0Util.release(conn, stmt, rs);
}
}