一、連接池
在普通的數(shù)據(jù)庫(kù)訪問程序中,客戶程序得到的連接對(duì)象是物理連接,調(diào)用連接對(duì)象的close()方法將關(guān)閉連接,而采用連接池技術(shù),客戶程序得到的連接對(duì)象是連接池中物理連接的一個(gè)句柄,調(diào)用連接對(duì)象的close()方法,物理連接并沒有關(guān)閉,數(shù)據(jù)源的實(shí)現(xiàn)只是刪除了客戶程序中的連接對(duì)象和池中的連接對(duì)象之間的聯(lián)系。
二、連接池框架比較
目前常用的連接池框架主要有c3p0、dbcp、proxool、druid。Spring 推薦使用dbcp;Hibernate 推薦使用c3p0和proxool
1、 DBCP:apache
DBCP(DataBase connection pool)數(shù)據(jù)庫(kù)連接池。是apache上的一個(gè) java連接池項(xiàng)目,也是 tomcat使用的連接池組件。單獨(dú)使用dbcp需要3個(gè)包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立數(shù)據(jù)庫(kù)連接是一個(gè)非常耗時(shí)耗資源的行為,所以通過連接池預(yù)先同數(shù)據(jù)庫(kù)建立一些連接,放在內(nèi)存中,應(yīng)用程序需要建立數(shù)據(jù)庫(kù)連接時(shí)直接到連接池中申請(qǐng)一個(gè)就行,用完后再放回去。dbcp沒有自動(dòng)的去回收空閑連接的功能。
2、 C3P0:
C3P0是一個(gè)開源的jdbc連接池,它實(shí)現(xiàn)了數(shù)據(jù)源和jndi綁定,支持jdbc3規(guī)范和jdbc2的標(biāo)準(zhǔn)擴(kuò)展。c3p0是異步操作的,緩慢的jdbc操作通過幫助進(jìn)程完成。擴(kuò)展這些操作可以有效的提升性能。目前使用它的開源項(xiàng)目有Hibernate,Spring等。c3p0有自動(dòng)回收空閑連接功能。
3、 Proxool:Sourceforge
Proxool是一種Java數(shù)據(jù)庫(kù)連接池技術(shù)。是sourceforge下的一個(gè)開源項(xiàng)目,這個(gè)項(xiàng)目提供一個(gè)健壯、易用的連接池,最為關(guān)鍵的是這個(gè)連接池提供監(jiān)控的功能,方便易用,便于發(fā)現(xiàn)連接泄漏的情況。
綜合來說,穩(wěn)定性是dbcp>=c3p0>proxool
后來阿里巴巴的Druid開源了,Druid首先是一個(gè)數(shù)據(jù)庫(kù)連接池,但它不僅僅是一個(gè)數(shù)據(jù)庫(kù)連接池,它還包含一個(gè)ProxyDriver,一系列內(nèi)置的JDBC組件庫(kù),一個(gè)SQLParser。Druid支持所有JDBC兼容的數(shù)據(jù)庫(kù),包括Oracle、MySql、Derby、Postgresql、SQLServer、H2等等。
Druid針對(duì)Oracle和MySql做了特別優(yōu)化,比如Oracle的PSCache內(nèi)存占用優(yōu)化,MySql的ping檢測(cè)優(yōu)化。Druid在監(jiān)控、可擴(kuò)展性、穩(wěn)定性和性能方面都有明顯的優(yōu)勢(shì)。Druid提供了Filter-Chain模式的擴(kuò)展API,可以自己編寫Filter攔截JDBC中的任何方法,可以在上面做任何事情,比如說性能監(jiān)控、SQL審計(jì)、用戶名密碼加密、日志等等。
三、在Spring Boot中加入Druid連接池
3.1 添加druid依賴
compile group: 'com.alibaba', name: 'druid', version: '1.1.17'
3.2 修改application.yml配置文件
spring:
########-spring datasource-########
datasource:
#賬號(hào)配置
url: jdbc:mysql://127.0.0.1:3306/retail_db?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
username: test
password: test
driver-class-name: com.mysql.cj.jdbc.Driver
#druid連接池配置
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
3.3 DruidConfiguration 配置類
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
/**
* @author Alan Chen
* @description Druid連接池監(jiān)控平臺(tái) http://localhost:8080/druid/index.html
* @date 2019/6/4
*/
@Configuration
public class DruidConfiguration {
@Bean
public ServletRegistrationBean startViewServlet(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
// IP白名單
servletRegistrationBean.addInitParameter("allow","127.0.0.1");
// IP黑名單(共同存在時(shí),deny優(yōu)先于allow)
servletRegistrationBean.addInitParameter("deny","127.0.0.1");
//控制臺(tái)管理用戶
servletRegistrationBean.addInitParameter("loginUsername","admin");
servletRegistrationBean.addInitParameter("loginPassword","123456");
//是否能夠重置數(shù)據(jù)
servletRegistrationBean.addInitParameter("resetEnable","false");
return servletRegistrationBean;
}
@Bean
public FilterRegistrationBean statFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//添加過濾規(guī)則
filterRegistrationBean.addUrlPatterns("/*");
//忽略過濾的格式
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
3.4 啟動(dòng)服務(wù),登錄Druid連接池監(jiān)控平臺(tái)
http://localhost:8080/druid/index.html

參考文章:
連接池的意義及阿里Druid