使用DBCP配置JDBC連接池
1、DBCP簡介
DBCP(DataBase connection pool),數據庫連接池。是 apache 上的一個 java 連接池項目,也是 tomcat 使用的連接池組件。單獨使用dbcp需要2個包:commons-dbcp.jar,commons-pool.jar由於建立數據庫連接是一個非常耗時耗資源的行爲,所以通過連接池預先同數據庫建立一些連接,放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完後再放回去。
這裏使用的版本是dbcp2。
詳細介紹:http://commons.apache.org/proper/commons-dbcp/configuration.html
2、依賴jar包
commons-dbcp2-2.1.1.jar
commons-pool2-2.4.3.jar
commons-logging.jar
下載連接 http://www.apache.org/dist/commons/
3、代碼示例(以Oracle爲例)
1)jdbc.properties 文件
#連接設置
#Oracle
#oracle.jdbc.driver.OracleDriver
#SqlServer
#com.microsoft.sqlserver.jdbc.SQLServerDriver
#MySql
#com.microsoft.sqlserver.jdbc.MySQLServerDriver
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
username=admin
password=admin123
#初始化創建的連接數,當不夠時再去創建
initialSize=10
#最大連接數量,連接數連不能超過該值
maxTotal=100
#最大空閒連接,當空閒連接超過該值時就挨個關閉多餘的連接,但不能小於minldle
maxIdle=60
#最小空閒連接,空閒連接的最下值 -->
minIdle=10
#超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒,當連接超過該時間便認爲其實空閒連接
maxWaitMillis=60000
#非公平鎖
#useUnfairLock=true
#配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
timeBetweenEvictionRunsMillis=30000
#配置一個連接在池中最小生存的時間,單位是毫秒
minEvictableIdleTimeMillis=60000
#打開PSCache,並且指定每個連接上PSCache的大小
poolPreparedStatements=true
maxOpenPreparedStatements=100
#maxPoolPreparedStatementPerConnectionSize=20
#validationQuery=
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
maxConnLifetimeMillis=300000
#連接在所指定的秒數內未使用纔會被刪除(秒)
removeAbandonedTimeout=60
#程序中的連接不使用後是否被連接池回收
removeAbandoned=true
removeAbandonedOnBorrow=true
removeAbandonedOnMaintenance=true
numTestsPerEvictionRun=10
logAbandoned=true
#配置監控統計攔截的filters
#filters=stat
#JDBC驅動建立連接時附帶的連接屬性屬性的格式必須爲這樣:[屬性名=property;]
#注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裏不需要包含他們
connectionProperties=useUnicode=true;characterEncoding=UTF-8
#指定由連接池所創建的連接的自動提交(auto-commit)狀態
defaultAutoCommit=false
#driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。
#可用值爲下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=SERIALIZABLE
2)使用連接池獲取連接
protected Connection getConnection() throws Exception {
Connection conntion = null;
BasicDataSource source = null;
try {
String filePath = super.getClass().getClassLoader().getResource("/").getPath() + "config/jdbc.properties";
filePath = URLDecoder.decode(filePath);
Properties prop = new Properties();
prop.load(new FileReader(filePath));
source = BasicDataSourceFactory.createDataSource(prop);
if(source.getConnection().isWrapperFor(OracleConnection.class)){
conntion = source.getConnection().unwrap(OracleConnection.class);
}else{
conntion = source.getConnection();
}
} catch (SQLException e) {
LOGGER.error(">> " + e.toString());
throw new RuntimeException("創建數據庫連接失敗!", e);
} finally {
if(source != null){
source.close();
}
}
conntion.setAutoCommit(false);
return conntion;
}
4、總結
maxIdle值與maxActive值應配置的接近。
當連接數超過maxIdle值後,剛剛使用完的連接就會立即被銷燬。
若maxIdle與maxActive相差較大,在高負載的系統中會導致頻繁的創建、銷燬連接,影響性能。
工作快3年, 這還是第一次寫博客,雖然有點簡單,不過也算一個好的開始。
上面例子遇到一個問題,在Oracle數據庫的環境下使用此方式配置連接池時,必須要修改Oracle數據庫默認的連接數(默認150),修改到300以上,否則每次啓動都會拋出ORA-12519: TNS:no appropriate service handler found 異常。
但是沒有找到原因,哪位同學知道 還請告知啊。。