springboot学习进阶(二)----配置数据源
? ? 做Java開發(fā)的都知道,后臺(tái)就是要跟數(shù)據(jù)庫進(jìn)行打交道的,什么增刪改查什么排序分組索引,也不是本文的重點(diǎn),就不詳細(xì)述說了,但是怎么連接數(shù)據(jù)庫這個(gè)在配置數(shù)據(jù)庫的時(shí)候,是必須要清楚的。傳統(tǒng)的數(shù)據(jù)庫鏈接方式就是jdbc創(chuàng)建一個(gè)數(shù)據(jù)庫連接,然后執(zhí)行完sql操作之后再刪除,到現(xiàn)在使用了數(shù)據(jù)庫連接池,為什么使用數(shù)據(jù)庫連接池這里也不再闡述,網(wǎng)上有很多文章都有。
? ? 既然說到數(shù)據(jù)庫連接池,那么就列舉一下Java開發(fā)所常見的一些數(shù)據(jù)庫連接池,并分別給出每一個(gè)連接池的優(yōu)劣以及在spring boot中怎么配置連接的。
1、C3P0
開源的JDBC連接池,實(shí)現(xiàn)了數(shù)據(jù)源和JNDI綁定,支持JDBC3規(guī)范和JDBC2的標(biāo)準(zhǔn)擴(kuò)展。目前使用它的開源項(xiàng)目有Hibernate、Spring等。單線程,性能較差,適用于小型系統(tǒng),代碼600KB左右。
2、DBCP
由Apache開發(fā)的一個(gè)Java數(shù)據(jù)庫連接池項(xiàng)目, Jakarta commons-pool對象池機(jī)制,Tomcat使用的連接池組件就是DBCP。單獨(dú)使用dbcp需要3個(gè)包:common-dbcp.jar,common-pool.jar,common-collections.jar,預(yù)先將數(shù)據(jù)庫連接放在內(nèi)存中,應(yīng)用程序需要建立數(shù)據(jù)庫連接時(shí)直接到連接池中申請一個(gè)就行,用完再放回。單線程,并發(fā)量低,性能不好,適用于小型系統(tǒng)。
3、Tomcat jdbc pool
Tomcat在7.0以前都是使用common-dbcp做為連接池組件,但是dbcp是單線程,為保證線程安全會(huì)鎖整個(gè)連接池,性能較差,dbcp有超過60個(gè)類,也相對復(fù)雜。Tomcat從7.0開始引入了新增連接池模塊叫做Tomcat jdbc pool,基于Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通過異步方式獲取連接,支持高并發(fā)應(yīng)用環(huán)境,超級(jí)簡單核心文件只有8個(gè),支持JMX,支持XA Connection。
4、BoneCP
官方說法BoneCP是一個(gè)高效、免費(fèi)、開源的Java數(shù)據(jù)庫連接池實(shí)現(xiàn)庫。設(shè)計(jì)初衷就是為了提高數(shù)據(jù)庫連接池性能,根據(jù)某些測試數(shù)據(jù)顯示,BoneCP的速度是最快的,要比當(dāng)時(shí)第二快速的連接池快25倍左右,完美集成到一些持久化產(chǎn)品如Hibernate和DataNucleus中。BoneCP特色:高度可擴(kuò)展,快速;連接狀態(tài)切換的回調(diào)機(jī)制;允許直接訪問連接;自動(dòng)化重置能力;JMX支持;懶加載能力;支持XML和屬性文件配置方式;較好的Java代碼組織,100%單元測試分支代碼覆蓋率;代碼40KB左右。
5、Druid
Druid是Java語言中最好的數(shù)據(jù)庫連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,是一個(gè)可用于大數(shù)據(jù)實(shí)時(shí)查詢和分析的高容錯(cuò)、高性能的開源分布式系統(tǒng),尤其是當(dāng)發(fā)生代碼部署、機(jī)器故障以及其他產(chǎn)品系統(tǒng)遇到宕機(jī)等情況時(shí),Druid仍能夠保持100%正常運(yùn)行。主要特色:為分析監(jiān)控設(shè)計(jì);快速的交互式查詢;高可用;可擴(kuò)展;Druid是一個(gè)開源項(xiàng)目,源碼托管在github上。
6、HikariCP
hikariCP是最近才開始接觸到的一個(gè)數(shù)據(jù)庫連接池,聽說是在boneCP的基礎(chǔ)上做了重新的優(yōu)化。性能分析如下:
-
HikariCP通過優(yōu)化(concurrentBag,fastStatementList )集合來提高并發(fā)的讀寫效率。
-
HikariCP使用threadlocal緩存連接及大量使用CAS的機(jī)制,最大限度的避免lock。單可能帶來cpu使用率的上升。
-
從字節(jié)碼的維度優(yōu)化代碼。 (default inline threshold for a JVM running the server Hotspot compiler is 35 bytecodes )讓方法盡量在35個(gè)字節(jié)碼一下,來提升jvm的處理效率。
通過一張對比表格分析各個(gè)數(shù)據(jù)庫連接池的特點(diǎn):
| 功能 | C3P0 | DBCP | Tomcat jdbc pool | BoneCP | Druid | HikariCP |
| 線程同步 | 單線程 | 單線程 | 多線程、異步 | 多線程、異步 | 多線程、異步 | 多線程、異步 |
| PSCache | 支持 | 支持 | 支持 | 支持 | 支持 | 否 |
| LRU | 否 | 是 | ? | 否 | 是 | ? |
| ExceptionSorter | 否 | 否 | 否 | 否 | 是 | ? |
| 監(jiān)控 | jmx、log | jmx | jmx | jmx | jmx、log、http | jmx |
| 可擴(kuò)展性 | 差 | 差 | 差 | 較好 | 好 | 弱 |
| 連接池管理 | 隊(duì)列 | ? LinkedBlockingDeque ? FIFO隊(duì)列、FILO堆棧 | FairBlockingQueue | 堆棧 | 數(shù)組、 CopyOnWriteArrayList | threadloacl、 CopyOnWriteArrayList |
| 代碼復(fù)雜度 | 復(fù)雜 | 中等,超過60個(gè)類 | 簡單,8個(gè)核心類 | 簡單,40kb | 中等 | 簡單 |
| 更新維護(hù) | 否 | 否 | 是 | 否 | 是 | 是 |
| 開源項(xiàng)目集成 | spring、 hibernate | tomcat組件 | Tomcat7以后 | hibernate、 DataNucleus | Druid | ?? |
LRU
LRU是一個(gè)性能關(guān)鍵指標(biāo),特別Oracle,每個(gè)Connection對應(yīng)數(shù)據(jù)庫端的一個(gè)進(jìn)程,如果數(shù)據(jù)庫連接池遵從LRU,有助于數(shù)據(jù)庫服務(wù)器優(yōu)化,這是重要的指標(biāo)。在測試中,Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0則不是。BoneCP在mock環(huán)境下性能可能好,但在真實(shí)環(huán)境中則就不好了。
PSCache
PSCache是數(shù)據(jù)庫連接池的關(guān)鍵指標(biāo)。在Oracle中,類似SELECT NAME FROM USER WHERE ID = ?這樣的SQL,啟用PSCache和不啟用PSCache的性能可能是相差一個(gè)數(shù)量級(jí)的。Proxool是不支持PSCache的數(shù)據(jù)庫連接池,如果你使用Oracle、SQL Server、DB2、Sybase這樣支持游標(biāo)的數(shù)據(jù)庫,那你就完全不用考慮Proxool。
ExceptionSorter
ExceptionSorter是一個(gè)很重要的容錯(cuò)特性,如果一個(gè)連接產(chǎn)生了一個(gè)不可恢復(fù)的錯(cuò)誤,必須立刻從連接池中去掉,否則會(huì)連續(xù)產(chǎn)生大量錯(cuò)誤。這個(gè)特性,目前只有JBossDataSource和Druid實(shí)現(xiàn)。Druid的實(shí)現(xiàn)參考自JBossDataSource。
監(jiān)控
DruidDataSource自身提供有NotEmptyWaitCount、PSCahcheHitCount等有用的監(jiān)控屬性,通過配置StatFilter能夠監(jiān)控SQL的執(zhí)行情況。
?
? ? 在了解了常用的數(shù)據(jù)庫連接池之后,我們再來研究一下,spring boot怎么集成這些數(shù)據(jù)庫連接池的。(注:因幾個(gè)連接池已經(jīng)不再更新維護(hù),而Tomcat Jdbc Pool一般不會(huì)用于Java項(xiàng)目連接池,因此此處我們只做druid跟HikariCP連接池的配置使用)
?
一、使用druid連接mysql
在項(xiàng)目的pom文件中添加mysql及druid的相關(guān)依賴(mysql依賴添加的時(shí)候,需要注意一下跟自己的版本匹配)
<!-- druid連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><!-- mysql --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.17</version></dependency>在spring boot中添加相關(guān)properties配置
# mysqlspring.datasource.type=com.alibaba.druid.pool.DruidDataSourcespring.datasource.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=UTF-8&useSSL=falsespring.datasource.driverClassName=com.mysql.jdbc.Driverspring.datasource.username=rootspring.datasource.password=123456# DataSourcespring.datasource.initialSize=1spring.datasource.minIdle=1spring.datasource.maxActive=20spring.datasource.maxWait=60000spring.datasource.validationQuery=SELECT 1 FROM DUALspring.datasource.testOnBorrow=falsespring.datasource.testOnReturn=falsespring.datasource.testWhileIdle=truespring.datasource.minEvictableIdleTimeMillis=25200000spring.datasource.timeBetweenEvictionRunsMillis=60000spring.datasource.removeAbandoned=truespring.datasource.removeAbandonedTimeout=1800spring.datasource.poolPreparedStatements=truespring.datasource.maxPoolPreparedStatementPerConnectionSize=20spring.datasource.logAbandoned=truespring.datasource.filters=stat,wall?啟動(dòng)項(xiàng)目,然后訪問http://localhost:9000/druid/index.html,druid連接池就配置好了
?
二、使用HikariCP連接池
因?yàn)閟pring boot2默認(rèn)使用的是hikariCP作為連接池,所以版本在2以上的可以省略maven依賴,直接在配置文件中加入如下配置信息即可
# jdbc_config datasource spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull spring.datasource.username=root spring.datasource.password=root # Hikari will use the above plus the following to setup connection pooling spring.datasource.type=com.zaxxer.hikari.HikariDataSource spring.datasource.hikari.minimum-idle=5 spring.datasource.hikari.maximum-pool-size=15 spring.datasource.hikari.auto-commit=true spring.datasource.hikari.idle-timeout=30000 spring.datasource.hikari.pool-name=DatebookHikariCP spring.datasource.hikari.max-lifetime=1800000 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.connection-test-query=SELECT 1?
本文參考網(wǎng)址:
1、https://www.toutiao.com/a6551532416505217539/?tt_from=mobile_qq&utm_campaign=client_share×tamp=1526087841&app=news_article&utm_source=mobile_qq&iid=32174471432&utm_medium=toutiao_android
2、https://blog.csdn.net/a1178016652/article/details/45027619
3、https://blog.csdn.net/moshowgame/article/details/80304198
4、http://www.cnblogs.com/liaojie970/p/9106187.html
總結(jié)
以上是生活随笔為你收集整理的springboot学习进阶(二)----配置数据源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS机器人系列竞赛之工业自动化(侧重机
- 下一篇: 如何killtomcat进程_查看并杀掉