資料庫連接池的理解和使用,資料庫連接池理解

來源:互聯網
上載者:User

資料庫連接池的理解和使用,資料庫連接池理解
一、什麼是資料庫連接池?

官方:資料庫連接池(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));        }    }

運行結果如所示:

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



著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.