文章轉載自:https://blog.csdn.net/hu_belif/article/details/80812047
一、什么是數據庫連接池?
官方:數據庫連接池(Connection pooling)是程序啟動時建立足夠的數據庫連接,並將這些連接組成一個連接池,由程序動態地對池中的連接進行申請,使用,釋放。
個人理解:創建數據庫連接是一個很耗時的操作,也容易對數據庫造成安全隱患。所以,在程序初始化的時候,集中創建多個數據庫連接,並把他們集中管理,供程序使用,可以保證較快的數據庫讀寫速度,還更加安全可靠。
二、數據庫連接池的運行機制
(1) 程序初始化時創建連接池
(2) 使用時向連接池申請可用連接
(3) 使用完畢,將連接返還給連接池
(4) 程序退出時,斷開所有連接,並釋放資源
(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));
- }
- }
運行結果如下圖所示:


測試結果表明,在使用連接池時,只在第一次初始化時,比較耗時,完成初始化之后,使用連接池進行數據庫操作明顯比不使用連接池花費的時間少。