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對象。