springBoot入門總結(十)常用的連接池

JAVA中常用的主流開源數據

所有數據庫鏈接池都遵守基本的設計規則,實現 javax.sql.DataSource 接口,裏面最重要的方法就是 Connection getConnection() throws SQLException; 用於獲取一個Connection, 一個Connection就是一個數據庫鏈接,就是一個TCP鏈接(建立TCP連接建立時的三次握手和銷燬時的四次握手),這降低了鏈接的使用效率,也是各種數據庫鏈接池存在的原因。

連接池的作用是爲了提高性能,將已經創建好的連接保存在池中,當有請求來時,直接使用已經創建好的連接對Server端進行訪問。這樣複用了創建連接和銷燬連接的過程,從而在性能上得到了提高。

JAVA中常用的主流開源數據庫連接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid、HiKariCP等。

C3P0:C3P0是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate、Spring等。單線程,性能較差,適用於小型系統。C3P0已經很久沒有更新了。

DBCP:由Apache開發的一個Java數據庫連接池項目, DBCP連接池是tomcat使用的連接池組件,其一般用在程序初始化的時候,預先創建多個Connection對象放在內存中備用,應用程序需要建立數據庫連接時,直接到連接池中申請,使用完畢後再放回連接池。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar。單線程,併發量低,性能不好,適用於小型系統。DBCP更新速度很慢,基本處於不活躍狀態。

Tomcat Jdbc Pool:Tomcat在7.0以前都是使用common-dbcp做爲連接池組件,但是dbcp是單線程,爲保證線程安全會鎖整個連接池,性能較差。Tomcat從7.0開始引入了新增連接池模塊叫做Tomcat jdbc pool,基於Tomcat JULI,使用Tomcat日誌框架,完全兼容dbcp,通過異步方式獲取連接,支持高併發應用環境。

BoneCP:是一個高效、免費、開源的Java數據庫連接池實現庫。BoneCP特色:高度可擴展,快速;連接狀態切換的回調機制;允許直接訪問連接;自動化重置能力;JMX支持;懶加載能力;支持XML和屬性文件配置方式;較好的Java代碼組織,100%單元測試分支代碼覆蓋率。

Alibaba Druid:Druid是Java語言中最好的數據庫連接池,Druid能夠提供強大的監控和擴展功能,是一個可用於大數據實時查詢和分析的高容錯、高性能的開源分佈式系統,尤其是當發生代碼部署、機器故障以及其他產品系統遇到宕機等情況時,Druid仍能夠保持100%正常運行。主要特色:爲分析監控設計;快速的交互式查詢;高可用;可擴展;Druid是一個開源項目,源碼託管在github上。

HiKariCP: HiKariCP 來源於日語「光」的意思,意味着它很快!高性能的JDBC連接池,spring boot2.0 已經將 HikariCP 做爲了默認的數據源鏈接池。

以上,HiKariCP 以及 Alibaba Druid 是二代連接池中的代表,以下將着重介紹 HiKariCP 及 Alibaba Druid。

HiKariCP

HiKariCP的優點:

1、字節碼精簡 :優化代碼,直到編譯後的字節碼最少,這樣,CPU緩存可以加載更多的程序代碼;
2、優化代理和攔截器:減少代碼,例如HikariCP的Statement proxy只有100行代碼,只有BoneCP的十分之一;
3、自定義數組類型(FastStatementList)代替ArrayList:避免每次get()調用都要進行range check,避免調用remove()時的從頭到尾的掃描;
4、自定義集合類型(ConcurrentBag):提高併發讀寫的效率;


在spring Boot 1.0 當中使用的是Tomcat DataSource,從Spring Boot 2.0開始,Spring Boot 使用HiKariCP作爲默認數據庫連接池,所以Spring Boot 2.+ 引用parents後不用專門再添加依賴另外導入包和配置。

Spring Boot 2.+ 配置示例:

spring.datasource.url=jdbc:mysql://mysql.local:3306/text?serverTimezone=GMT%2B8&characterEncoding=utf8&useUnicode=true&useSSL=false&allowMultiQueries=true&zeroDateTimeBehavior=CONVERT_TO_NULL&autoReconnect=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 可選配置
spring.datasource.type=com.zaxxer.hikari.hIkari.HikariDatasource
spring.datasource.hikari.minimumIdle=10

# Hikari連接池的設置
## Hikari 時間單位都是毫秒
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
## 連接池名字
spring.datasource.hikari.pool-name=MyHikariCP
## 最小空閒連接數量
spring.datasource.hikari.minimum-idle=10
## 空閒連接存活最大時間,默認600000(10分鐘)
spring.datasource.hikari.idle-timeout=600000
## 連接池最大連接數,默認是10
spring.datasource.hikari.maximum-pool-size=10
## 此屬性控制從池返回的連接的默認自動提交行爲,默認值:true
spring.datasource.hikari.auto-commit=true
## 此屬性控制池中連接的最長生命週期,值0表示無限生命週期,默認1800000即30分鐘
spring.datasource.hikari.max-lifetime=1800000
## 數據庫連接超時時間,默認30秒,即30000
spring.datasource.hikari.connection-timeout=30000

Spring Boot 1.x 默認使用的是 Tomcat 連接池,如果要使用HiKariCP,需要移除 tomcat-jdbc依賴,配置 spring.datasource.type=com.zaxxer.hikari.hIkari.HikariDatasource

Alibaba Druid

Github:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

Druid連接池是阿里巴巴開源的數據庫連接池項目,Druid連接池爲監控而生,內置強大的監控功能,監控特性不影響性能。功能強大,能放SQL注入,內置 Logging 能診斷Hack應用行爲。

實用功能:

1、詳細的監控。
2、ExceptionSorter ,針對主流數據庫返回碼都有支持。
3、SQL注入
4、內置加密配置
5、衆多擴展,方便進行定製。

spring boot 集成 Druid

1、引入POM依賴

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.10</version>
</dependency>

2、配置application.properties

server.port=8080
 
spring.application.name=springboot-druid-test
#使用阿里的Druid連接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#數據庫的url、登錄名、密碼和數據庫名
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/databaseName?useSSL=false&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#連接池的配置信息
#初始化大小,最小,最大
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.maxActive=20
#配置獲取連接等待超時的時間
spring.datasource.druid.maxWait=60000
#配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
spring.datasource.druid.minEvictableIdleTimeMillis=300000
spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
#打開PSCache,並且指定每個連接上PSCache的大小
spring.datasource.druid.poolPreparedStatements=true
spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20
#配置監控統計攔截的filters,去掉後監控界面sql無法統計,'wall'用於防火牆
spring.datasource.druid.filters=stat,wall,log4j
#通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
spring.datasource.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000
#配置DruidStatFilter
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
#配置DruidStatViewServlet
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
#IP白名單(沒有配置或者爲空,則允許所有訪問)
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.163.1
#IP黑名單 (存在共同時,deny優先於allow)
spring.datasource.druid.stat-view-servlet.deny=192.168.1.73
#禁用HTML頁面上的“Reset All”功能
spring.datasource.druid.stat-view-servlet.reset-enable=false
#登錄名
spring.datasource.druid.stat-view-servlet.login-username=admin
#登錄密碼
spring.datasource.druid.stat-view-servlet.login-password=123456

 

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