Mysql 8.0 創建DBCP連接池

DBCP連接池簡介

     DBCP(DataBase connection pool)數據庫連接池是 apache 上的一個Java連接池項目。DBCP通過連接池預先同數據庫建立一些連接放在內存中(即連接池中),應用程序需要建立數據庫連接時直接到從接池中申請一個連接使用,用完後由連接池回收該連接,從而達到連接複用,減少資源消耗的目的。

MySQL 8.0

MySQL 8.0以後,對java連接MySQL的驅動進行了更新,使用mysql-connector-java-8.*方可進行數據庫連接,在調用驅動包時也需要調用

com.mysql.cj.jdbc.Driver

創建基於MySQL8.0的DBCP連接池

創建DBCPUtils.java

創建數據庫連接池需要導入 五個jar包,

* commons-collections
 * commons-dbcp2
 * commons-logging
 * commons-pool2
 * mysql-connector

import org.apache.commons.dbcp2.BasicDataSourceFactory;
import javax.sql.DataSource;
import java.sql.*;
import java.util.Properties;


/*
 * DBCP連接池在構建時需要引入
 * commons-collections
 * commons-dbcp2
 * commons-logging
 * commons-pool2
 * mysql-connector
 * 共五個jar包,缺一不可*/


/**
 * 本模塊構建了一個DBCP連接池
 * DBCP連接池配置位於config/dbcpconfig.properties中
 * 連接數據庫qzqmall user:root password:admin useSSL:false charset:utf8
 */
public class DBCPUtils {
    private static DataSource ds;//定義一個連接池對象
    static{
        try {
            Properties pro = new Properties();
            pro.load(DBCPUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
            ds = BasicDataSourceFactory.createDataSource(pro);//得到一個連接池對象
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化連接錯誤,請檢查配置文件!");
        }
    }


    /**
     * 構造從連接池取出連接的方法
     * @return Connection
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 關閉rs & stmt & conn
     * @param rs ResultSet
     * @param stmt Statement
     * @param conn Connection
     */
    public static void closeAll(ResultSet rs, Statement stmt, Connection conn){
        if(rs!=null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(stmt!=null){
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if(conn!=null){
            try {
                conn.close();//關閉
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 測試類
     * @param args
     */
    public static void main(String[] args) {
        try {
            System.out.println("對DBCP池進行測試");
            Connection con = DBCPUtils.getConnection();
            Statement stmt = con.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT * FROM book");
            System.out.println(rs.next());
            closeAll(rs,stmt,con);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

創建DBCP連接池配置文件

該文件用於配置數據庫連接池的IP、端口、用戶、密碼以及連接數等配置信息。

在連接MySQL 8.0及更高版本時,不僅需要設置字符編碼屬性,還需要對時區進行設置serverTimezone=UTC;

此外,連接Mysql8.0及更高版本時,驅動名爲com.mysql.cj.jdbc.Driver,在8.0之前的版本爲com.mysql.jdbc.Driver

#連接設置
driverClassName=com.mysql.cj.jdbc.Driver
#設置數據庫端口、數據庫名
url=jdbc:mysql://localhost:3306/DB_Name
#設置數據庫連接用戶、密碼
username=root
password=admin

#<!-- 初始化連接 -->
initialSize=10

#最大連接數量
maxActive=50

#<!-- 最大空閒連接 -->
maxIdle=20

#<!-- 最小空閒連接 -->
minIdle=5

#<!-- 超時等待時間以毫秒爲單位 60000毫秒/1000等於60秒 -->
maxWait=60000


#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須爲這樣:[屬性名=property;]
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裏不需要包含他們。
connectionProperties=useUnicode=true;characterEncoding=utf8;useSSL=false;serverTimezone=UTC;allowPublicKeyRetrieval=true

#指定由連接池所創建的連接的自動提交(auto-commit)狀態。
defaultAutoCommit=true

#driver default 指定由連接池所創建的連接的只讀(read-only)狀態。
#如果沒有設置該值,則“setReadOnly”方法將不被調用。(某些驅動並不支持只讀模式,如:Informix)
#defaultReadOnly=

#driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
#可用值爲下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ

至此,數據庫連接池創建完成,使用數據庫連接時可import DBCPUtils,並調用DBCPUtils中的getConnection()方法獲取數據庫連接,當數據庫連接使用完畢後,可調用closeAll()方法,關閉Connection、Statement(or PreparedStatement)、ResultSet對象。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章