相信學(xué)過jdbc的童鞋應(yīng)該都對如下代碼比較熟悉;
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
//注冊驅(qū)動
Class.forName("com.mysql.cj.jdbc.Driver");
//獲取連接
Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/test?allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&maxReconnects=100&failOverReadOnly=false&initialTimeout=10&zeroDateTimeBehavior=convertToNull","root","" ); //(url,user,password)
//獲取操作數(shù)據(jù)庫的預(yù)處理對象
PreparedStatement pstem = conn.prepareStatement("select * from student1");
//執(zhí)行SQL潮酒,得到結(jié)果集
ResultSet rs = pstem.executeQuery();
//遍歷結(jié)果集
while(rs.next()) {
System.out.println(rs.getString("name"));
}
//釋放資源
rs.close();
pstem.close();
conn.close();
}
這是啥? 打開數(shù)據(jù)庫鏈接,然后進行一次執(zhí)行sql操作,然后關(guān)閉鏈接釋放資源對吧? 有了這個util,我們就會方便很多,每次用java執(zhí)行sql,都需要調(diào)用這個工具類即可,1 獲取一個鏈接,執(zhí)行sql 2 關(guān)閉鏈接;
但是實際上,這種經(jīng)常開關(guān)鏈接的方式,其實是很浪費性能/資源的,頻繁的開關(guān)比執(zhí)行sql浪費的時間.性能要高得多!!!
于是連接池應(yīng)運而生;
常見的連接池有 c3p0 boot項目默認(rèn)支持的Hikari 以及阿里巴巴連接池 那么為什么用了連接池可以提升性能,是怎么提升的呢?
用了連接池的性能提升原因是,不在頻繁開關(guān)數(shù)據(jù)庫鏈接了;
提升關(guān)鍵是: 連接池在服務(wù)啟動的時候,就開啟了一定數(shù)量的鏈接,根據(jù)配置的數(shù)量開啟,然后一直維護著這些鏈接,存儲在連接池中,每次java程序執(zhí)行sql,都會去連接池中取到一個鏈接,執(zhí)行,然后并不調(diào)用close釋放該鏈接,而是將 該鏈接重新放回連接池中,這樣就不會頻繁開關(guān)數(shù)據(jù)庫的鏈接了;這就是連接池的工作原理;
連接池常用的配置參數(shù)一覽; 這些參數(shù)其實不是隨便配置的,都是有參考標(biāo)準(zhǔn)的;
以druid阿里巴巴 數(shù)據(jù)庫連接池組件為例炉抒。
spring:
datasource:
# 數(shù)據(jù)源基本配置
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/ssm_crud
type: com.alibaba.druid.pool.DruidDataSource
# 數(shù)據(jù)源其他配置
druid:
# 配置初始化大小、最小、最大線程數(shù)
initialSize: 5
minIdle: 5
# CPU核數(shù)+1,也可以大些但不要超過20,數(shù)據(jù)庫加鎖時連接過多性能下降
maxActive: 20
# 最大等待時間辆琅,內(nèi)網(wǎng):800,外網(wǎng):1200(三次握手1s)
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
# 配置一個連接在池中最大空間時間这刷,單位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
# 設(shè)置從連接池獲取連接時是否檢查連接有效性婉烟,true檢查,false不檢查
testOnBorrow: true
# 設(shè)置從連接池歸還連接時是否檢查連接有效性暇屋,true檢查似袁,false不檢查
testOnReturn: true
# 可以支持PSCache(提升寫入、查詢效率)
poolPreparedStatements: true
# 配置監(jiān)控統(tǒng)計攔截的filters咐刨,去掉后監(jiān)控界面sql無法統(tǒng)計昙衅,'wall'用于防火墻
filters: stat,wall,log4j
# 保持長連接
keepAlive: true
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500