springboot学习进阶(二)----配置数据源
? ? 做Java開發的都知道,后臺就是要跟數據庫進行打交道的,什么增刪改查什么排序分組索引,也不是本文的重點,就不詳細述說了,但是怎么連接數據庫這個在配置數據庫的時候,是必須要清楚的。傳統的數據庫鏈接方式就是jdbc創建一個數據庫連接,然后執行完sql操作之后再刪除,到現在使用了數據庫連接池,為什么使用數據庫連接池這里也不再闡述,網上有很多文章都有。
? ? 既然說到數據庫連接池,那么就列舉一下Java開發所常見的一些數據庫連接池,并分別給出每一個連接池的優劣以及在spring boot中怎么配置連接的。
1、C3P0
開源的JDBC連接池,實現了數據源和JNDI綁定,支持JDBC3規范和JDBC2的標準擴展。目前使用它的開源項目有Hibernate、Spring等。單線程,性能較差,適用于小型系統,代碼600KB左右。
2、DBCP
由Apache開發的一個Java數據庫連接池項目, Jakarta commons-pool對象池機制,Tomcat使用的連接池組件就是DBCP。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar,預先將數據庫連接放在內存中,應用程序需要建立數據庫連接時直接到連接池中申請一個就行,用完再放回。單線程,并發量低,性能不好,適用于小型系統。
3、Tomcat jdbc pool
Tomcat在7.0以前都是使用common-dbcp做為連接池組件,但是dbcp是單線程,為保證線程安全會鎖整個連接池,性能較差,dbcp有超過60個類,也相對復雜。Tomcat從7.0開始引入了新增連接池模塊叫做Tomcat jdbc pool,基于Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通過異步方式獲取連接,支持高并發應用環境,超級簡單核心文件只有8個,支持JMX,支持XA Connection。
4、BoneCP
官方說法BoneCP是一個高效、免費、開源的Java數據庫連接池實現庫。設計初衷就是為了提高數據庫連接池性能,根據某些測試數據顯示,BoneCP的速度是最快的,要比當時第二快速的連接池快25倍左右,完美集成到一些持久化產品如Hibernate和DataNucleus中。BoneCP特色:高度可擴展,快速;連接狀態切換的回調機制;允許直接訪問連接;自動化重置能力;JMX支持;懶加載能力;支持XML和屬性文件配置方式;較好的Java代碼組織,100%單元測試分支代碼覆蓋率;代碼40KB左右。
5、Druid
Druid是Java語言中最好的數據庫連接池,Druid能夠提供強大的監控和擴展功能,是一個可用于大數據實時查詢和分析的高容錯、高性能的開源分布式系統,尤其是當發生代碼部署、機器故障以及其他產品系統遇到宕機等情況時,Druid仍能夠保持100%正常運行。主要特色:為分析監控設計;快速的交互式查詢;高可用;可擴展;Druid是一個開源項目,源碼托管在github上。
6、HikariCP
hikariCP是最近才開始接觸到的一個數據庫連接池,聽說是在boneCP的基礎上做了重新的優化。性能分析如下:
-
HikariCP通過優化(concurrentBag,fastStatementList )集合來提高并發的讀寫效率。
-
HikariCP使用threadlocal緩存連接及大量使用CAS的機制,最大限度的避免lock。單可能帶來cpu使用率的上升。
-
從字節碼的維度優化代碼。 (default inline threshold for a JVM running the server Hotspot compiler is 35 bytecodes )讓方法盡量在35個字節碼一下,來提升jvm的處理效率。
通過一張對比表格分析各個數據庫連接池的特點:
| 功能 | C3P0 | DBCP | Tomcat jdbc pool | BoneCP | Druid | HikariCP |
| 線程同步 | 單線程 | 單線程 | 多線程、異步 | 多線程、異步 | 多線程、異步 | 多線程、異步 |
| PSCache | 支持 | 支持 | 支持 | 支持 | 支持 | 否 |
| LRU | 否 | 是 | ? | 否 | 是 | ? |
| ExceptionSorter | 否 | 否 | 否 | 否 | 是 | ? |
| 監控 | jmx、log | jmx | jmx | jmx | jmx、log、http | jmx |
| 可擴展性 | 差 | 差 | 差 | 較好 | 好 | 弱 |
| 連接池管理 | 隊列 | ? LinkedBlockingDeque ? FIFO隊列、FILO堆棧 | FairBlockingQueue | 堆棧 | 數組、 CopyOnWriteArrayList | threadloacl、 CopyOnWriteArrayList |
| 代碼復雜度 | 復雜 | 中等,超過60個類 | 簡單,8個核心類 | 簡單,40kb | 中等 | 簡單 |
| 更新維護 | 否 | 否 | 是 | 否 | 是 | 是 |
| 開源項目集成 | spring、 hibernate | tomcat組件 | Tomcat7以后 | hibernate、 DataNucleus | Druid | ?? |
LRU
LRU是一個性能關鍵指標,特別Oracle,每個Connection對應數據庫端的一個進程,如果數據庫連接池遵從LRU,有助于數據庫服務器優化,這是重要的指標。在測試中,Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0則不是。BoneCP在mock環境下性能可能好,但在真實環境中則就不好了。
PSCache
PSCache是數據庫連接池的關鍵指標。在Oracle中,類似SELECT NAME FROM USER WHERE ID = ?這樣的SQL,啟用PSCache和不啟用PSCache的性能可能是相差一個數量級的。Proxool是不支持PSCache的數據庫連接池,如果你使用Oracle、SQL Server、DB2、Sybase這樣支持游標的數據庫,那你就完全不用考慮Proxool。
ExceptionSorter
ExceptionSorter是一個很重要的容錯特性,如果一個連接產生了一個不可恢復的錯誤,必須立刻從連接池中去掉,否則會連續產生大量錯誤。這個特性,目前只有JBossDataSource和Druid實現。Druid的實現參考自JBossDataSource。
監控
DruidDataSource自身提供有NotEmptyWaitCount、PSCahcheHitCount等有用的監控屬性,通過配置StatFilter能夠監控SQL的執行情況。
?
? ? 在了解了常用的數據庫連接池之后,我們再來研究一下,spring boot怎么集成這些數據庫連接池的。(注:因幾個連接池已經不再更新維護,而Tomcat Jdbc Pool一般不會用于Java項目連接池,因此此處我們只做druid跟HikariCP連接池的配置使用)
?
一、使用druid連接mysql
在項目的pom文件中添加mysql及druid的相關依賴(mysql依賴添加的時候,需要注意一下跟自己的版本匹配)
<!-- 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中添加相關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?啟動項目,然后訪問http://localhost:9000/druid/index.html,druid連接池就配置好了
?
二、使用HikariCP連接池
因為spring boot2默認使用的是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?
本文參考網址:
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
總結
以上是生活随笔為你收集整理的springboot学习进阶(二)----配置数据源的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ROS机器人系列竞赛之工业自动化(侧重机
- 下一篇: 如何killtomcat进程_查看并杀掉