資料庫連接池的理解和使用,資料庫連接池理解
一、什麼是資料庫連接池?
官方:資料庫連接池(Connection pooling)是程式啟動時建立足夠的資料庫連接,並將這些串連組成一個串連池,由程式動態地對池中的串連進行申請,使用,釋放。
個人理解:建立資料庫連接是一個很耗時的操作,也容易對資料庫造成安全隱患。所以,在程式初始化的時候,集中建立多個資料庫連接,並把他們集中管理,供程式使用,可以保證較快的資料庫讀寫速度,還更加安全可靠。
二、資料庫連接池的運行機制(1) 程式初始化時建立串連池
(2) 使用時向串連池申請可用串連
(3) 使用完畢,將串連返還給串連池
(4) 程式退出時,斷開所有串連,並釋放資源
三、資料庫連接池的使用
作為開源的資料庫連接池,C3P0是一個優秀的串連池,效能也十分可靠。
首先到http://sourceforge.net/projects/c3p0/下載相應的jar包,總共三個,如所示。
其次將jar包匯入到工程當中,然後就可以使用cp30了。
範例程式碼如下:
package com.zww.server;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.SQLException;import com.mchange.v2.c3p0.ComboPooledDataSource;public final class ConnectionManager {//使用單利模式建立資料庫連接池 private static ConnectionManager instance; private static ComboPooledDataSource dataSource; private ConnectionManager() throws SQLException, PropertyVetoException { dataSource = new ComboPooledDataSource(); dataSource.setUser("root");//使用者名稱 dataSource.setPassword("123456"); //密碼 dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zww");//資料庫地址 dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setInitialPoolSize(5); //初始化串連數 dataSource.setMinPoolSize(1);//最小串連數 dataSource.setMaxPoolSize(10);//最大串連數 dataSource.setMaxStatements(50);//最長等待時間 dataSource.setMaxIdleTime(60);//最大空閑時間,單位毫秒 } public static final ConnectionManager getInstance() { if (instance == null) { try { instance = new ConnectionManager(); } catch (Exception e) { e.printStackTrace(); } } return instance; } public synchronized final Connection getConnection() { Connection conn = null; try { conn = dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return conn; }}
下面是測試代碼:
package com.zww.server;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;public class ConnectionDemo { public static void main(String[] args) throws SQLException { System.out.println("使用串連池................................"); for (int i = 0; i < 20; i++) { long beginTime = System.currentTimeMillis(); Connection conn = ConnectionManager.getInstance().getConnection(); try { PreparedStatement pstmt = conn.prepareStatement("select * from event"); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { // do nothing... } } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } long endTime = System.currentTimeMillis(); System.out.println("第" + (i + 1) + "次執行花費時間為:" + (endTime - beginTime)); } System.out.println("不使用串連池................................"); for (int i = 0; i < 20; i++) { long beginTime = System.currentTimeMillis(); MysqlDataSource mds = new MysqlDataSource(); mds.setURL("jdbc:mysql://localhost:3306/zww"); mds.setUser("root"); mds.setPassword("123456"); Connection conn = mds.getConnection(); try { PreparedStatement pstmt = conn.prepareStatement("select * from event"); ResultSet rs = pstmt.executeQuery(); while (rs.next()) { // do nothing... } } catch (SQLException e) { e.printStackTrace(); } finally { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } long endTime = System.currentTimeMillis(); System.out.println("第" + (i + 1) + "次執行花費時間為:" + (endTime - beginTime)); } }
運行結果如所示:
測試結果表明,在使用串連池時,只在第一次初始化時,比較耗時,完成初始化之後,使用串連池進行資料庫操作明顯比不使用串連池花費的時間少。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。