亚洲欧美日韩综合系列在线_91精品人妻一区二区_欧美大肥婆一级特大AA片_九色91视频免费观看_亚洲综合国产精品_av中文字幕在线不卡_久久精品色综合网_看黄色视频的软件_无卡无码高清中文字幕码2024_亚洲欧美日韩天堂网

為什么HikariCP被號稱為性能最好的Java數據庫連接池,如何配置使用

來源: Clement-Xu 發(fā)布時間:2018-11-01 10:21:29 閱讀量:875



而且,網上對于BoneCP是好評如潮啊,推薦的文章一搜一大堆。


然而,上Maven Repository網站(http://mvnrepository.com/artifact/com.jolbox/bonecp)查找有沒有最新版本的時候,你會發(fā)現最新的是2013年10月份的(這么久沒新版本出來了?)。于是,再去BoneCP的Githut(https://github.com/wwadge/bonecp)上看看最近有沒有提交代碼。卻發(fā)現,BoneCP的作者對于這個項目貌似已經心灰意冷,說是要讓步給HikariCP了(有圖有真相):





……什么?又來一個CP?……什么是Hikari?

Hikari來自日文,是“光”(陽光的光,不是光禿禿的光)的意思。作者估計是為了借助這個詞來暗示這個CP速度飛快。不知作者是不是日本人,不過日本也有很多優(yōu)秀的碼農,聽說比特幣據說日本人搞出來的。。。


這個產品的口號是“快速、簡單、可靠”。實際情況跟這個口號真的匹配嗎?又是有圖有真相(Benchmarks又來了):





這個圖,也間接地、再一次地證明了boneCP比c3p0強大很多,當然,跟“光”比起來,又弱了不少啊。


那么,這么好的P是怎么做到的呢?官網詳細地說明了HikariCP所做的一些優(yōu)化,總結如下:

字節(jié)碼精簡:優(yōu)化代碼,直到編譯后的字節(jié)碼最少,這樣,CPU緩存可以加載更多的程序代碼;

優(yōu)化代理和攔截器:減少代碼,例如HikariCP的Statement proxy只有100行代碼,只有BoneCP的十分之一;

自定義數組類型(FastStatementList)代替ArrayList:避免每次get()調用都要進行range check,避免調用remove()時的從頭到尾的掃描;

自定義集合類型(ConcurrentBag):提高并發(fā)讀寫的效率;

其他針對BoneCP缺陷的優(yōu)化,比如對于耗時超過一個CPU時間片的方法調用的研究(但沒說具體怎么優(yōu)化)。

很多優(yōu)化的對比都是針對BoneCP的……哈哈。

(參考文章:https://github.com/brettwooldridge/HikariCP/wiki/Down-the-Rabbit-Hole)


幾個連接池的代碼量對比(代碼量越少,一般意味著執(zhí)行效率越高、發(fā)生bug的可能性越低):





可是,“黃婆賣瓜,自催自擂”這個俗語日本人也是懂得,于是,用戶的好評如潮也是有圖有真相:



還有第三方關于速度的測試:



也許你會說,速度高,如果不穩(wěn)定也是硬傷啊。于是,關于穩(wěn)定性的圖也來了:



另外,關于可靠性方面,也是有實驗和數據支持的。對于數據庫連接中斷的情況,通過測試getConnection(),各種CP的不相同處理方法如下:

(所有CP都配置了跟connectionTimeout類似的參數為5秒鐘)

HikariCP:等待5秒鐘后,如果連接還是沒有恢復,則拋出一個SQLExceptions 異常;后續(xù)的getConnection()也是一樣處理;

C3P0:完全沒有反應,沒有提示,也不會在“CheckoutTimeout”配置的時長超時后有任何通知給調用者;然后等待2分鐘后終于醒來了,返回一個error;

Tomcat:返回一個connection,然后……調用者如果利用這個無效的connection執(zhí)行SQL語句……結果可想而知;大約55秒之后終于醒來了,這時候的getConnection()終于可以返回一個error,但沒有等待參數配置的5秒鐘,而是立即返回error;

BoneCP:跟Tomcat的處理方法一樣;也是大約55秒之后才醒來,有了正常的反應,并且終于會等待5秒鐘之后返回error了;


可見,HikariCP的處理方式是最合理的。根據這個測試結果,對于各個CP處理數據庫中斷的情況,評分如下:



參考文章:https://github.com/brettwooldridge/HikariCP/wiki/Bad-Behavior:-Handling-Database-Down



說得這么好,用起來會不會很麻煩啊,會不會有很多參數要配置才能有這樣的效果???答案是:不會。

如果之前用的是BoneCP配置的數據源,那么,就簡單了,只需要把dataSource換一下,稍微調整一下參數就行了:


BoneCP的數據源配置:

 <!-- BoneCp Datasource -->

 <bean id="dataSourceBoneCp" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">

  <property name="driverClass" value="${db.driverClass}" />

  <property name="jdbcUrl" value="${db.url}" />

  <property name="username" value="${db.username}" />

  <property name="password" value="${db.password}" />

  <property name="idleConnectionTestPeriodInMinutes" value="2" />

  <property name="idleMaxAgeInMinutes" value="2" />

  <property name="maxConnectionsPerPartition" value="2" />

  <property name="minConnectionsPerPartition" value="0" />

  <property name="partitionCount" value="2" />

  <property name="acquireIncrement" value="1" />

  <property name="statementsCacheSize" value="100" />

  <property name="lazyInit" value="true"/>

  <property name="maxConnectionAgeInSeconds" value="20"/>

  <property name="defaultReadOnly" value="true"/>

 </bean>


HiKariCP的數據源配置:

 <!-- Hikari Datasource -->

 <bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource"  destroy-method="shutdown">

  <!-- <property name="driverClassName" value="${db.driverClass}" /> --> <!-- 無需指定,除非系統(tǒng)無法自動識別 -->

  <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />

  <property name="username" value="${db.username}" />

  <property name="password" value="${db.password}" />

   <!-- 連接只讀數據庫時配置為true, 保證安全 -->

  <property name="readOnly" value="false" />

  <!-- 等待連接池分配連接的最大時長(毫秒),超過這個時長還沒可用的連接則發(fā)生SQLException, 缺省:30秒 -->

  <property name="connectionTimeout" value="30000" />

  <!-- 一個連接idle狀態(tài)的最大時長(毫秒),超時則被釋放(retired),缺省:10分鐘 -->

  <property name="idleTimeout" value="600000" />

  <!-- 一個連接的生命時長(毫秒),超時而且沒被使用則被釋放(retired),缺省:30分鐘,建議設置比數據庫超時時長少30秒,參考MySQL wait_timeout參數(show variables like '%timeout%';) -->

  <property name="maxLifetime" value="1800000" />

  <!-- 連接池中允許的最大連接數。缺省值:10;推薦的公式:((core_count * 2) + effective_spindle_count) -->

  <property name="maximumPoolSize" value="15" />

 </bean>


其中,很多配置都使用缺省值就行了,除了maxLifetime和maximumPoolSize要注意自己計算一下。

其他的配置(sqlSessionFactory、MyBatis MapperScannerConfigurer、transactionManager等)統(tǒng)統(tǒng)不用變。


其他關于Datasource配置參數的建議:

Configure your HikariCP idleTimeout and maxLifeTime settings to be one minute less than the wait_timeout of MySQL.

對于有Java連接池的系統(tǒng),建議MySQL的wait_timeout使用缺省的8小時(http://www.rackspace.com/knowledge_center/article/how-to-change-the-mysql-timeout-on-a-server)。

--------------------- 

作者:Clement-Xu 

來源:CSDN 

原文:https://blog.csdn.net/ClementAD/article/details/46928621 

版權聲明:本文為博主原創(chuàng)文章,轉載請附上博文鏈接!


標簽: 數據庫
分享:
評論:
你還沒有登錄,請先