淺談資料庫連線池
第一代連線池
區分一個數據庫連線池是屬於第一代產品還是第二代產品的一個最重要特徵就是看它在架構和設計時採用的執行緒模型 ,因為這直接影響的併發環境下存取資料庫連線的效能。
一般來講採用單執行緒同步的架構設計的都屬於第一代連線池,而採用多執行緒非同步架構的則屬於第二代。比較有代表性的就是 Apache Commons DBCP,在 1.x 版本中,一直延續這單執行緒設計模型,到 2.x 版本才採用多執行緒模型。
已經徹底死掉的 c3p0 和 proxool
c3p0 在很長一段時間內,它一直是 Java 領域內資料庫連線池的代名詞,當年盛極一時的 Hibernate 都將其作為內建的資料庫連線池。c3p0 功能簡單易用,穩定性好這,但效能很差,最致命的問題就是架構設計過於複雜。
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"></property> <property name="jdbcUrl" value="${jdbc.url}"></property> <property name="user" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean>
maven
<!-- https://mvnrepository.com/artifact/c3p0/c3p0 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>${c3pc.version}</version> </dependency>
proxool 由於產品作者興趣的缺失,讓這款本來很有潛力的產品早早夭折。
鹹魚翻身的dbcp
dbcp(DataBase Connection Pool)屬於 Apache 頂級專案 Commons 中的核心子專案,最為大家所熟知的 tomcat 就在內部集成了dbcp。但 dbcp 並不是獨立實現連線池功能的,它內部依賴於 Commons 中的另一個子專案 pool,連線池最核心的“池”,就是由 pool 元件提供的,因此,dbcp 的效能實際上就是 pool 的效能。
有很長一段時間,pool 都還是停留在 1.x 版本,這直接導致 dbcp 也更新乏力。在2013年 Commons-Pool 2.0 版本釋出,2014年,dbcp 也終於迎來了自己的2.0版本。但與新一代的產品專案相比,dbcp 沒有任何優勢。
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="10" /> <property name="maxIdle" value="5" /> </bean>
maven
<dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>${dbcp.version}</version> </dependency>
甘心赴死的BoneCP
BoneCP is a Java JDBC connection pool implementation that is tuned for high performance by minimizing lock contention to give greater throughput for your applications. It beats older connection pools such as C3P0 and DBCP but should now be considered deprecated in favour of HikariCP.
BoneCP 自稱效能是 c3p0 的25倍。但 BoneCP 本身很多特徵都依賴於Guava,因此也就和 dbcp 一樣,面臨更新乏力的問題。HikariCP 可以說是 BoneCP 的二代產品。
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close"> <!-- 資料庫驅動 --> <property name="driverClass" value="${jdbc.driver}" /> <!-- 相應驅動的jdbcUrl --> <property name="jdbcUrl" value="${jdbc.url}" /> <!-- 資料庫的使用者名稱 --> <property name="username" value="${jdbc.username}" /> <!-- 資料庫的密碼 --> <property name="password" value="${jdbc.password}" /> <!-- 檢查資料庫連線池中空閒連線的間隔時間,單位是分,預設值:240,如果要取消則設定為0 --> <property name="idleConnectionTestPeriod" value="60" /> <!-- 連線池中未使用的連結最大存活時間,單位是分,預設值:60,如果要永遠存活設定為0 --> <property name="idleMaxAge" value="30" /> <!-- 每個分割槽最大的連線數 --> <property name="maxConnectionsPerPartition" value="150" /> <!-- 每個分割槽最小的連線數 --> <property name="minConnectionsPerPartition" value="5" /> </bean>
maven
<dependency> <groupId>com.jolbox</groupId> <artifactId>bonecp</artifactId> <version>${bonecp.version}</version> </dependency>
站在巨人肩膀上的第二代連線池
在資料庫連線池的產品群中,二代產品對一代產品的超越是顛覆性的。其中,最具代表性的兩款產品是:
-
HikariCP
-
druid
功能全面的druid
druid 是阿里開源專案中的一個。它除了提供效能卓越的連線池功能外,還集成了 sql 監控,黑名單攔截等功能,用它自己的話說,druid 是“為監控而生”。
<!-- 配置 資料來源 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <!-- 驅動 --> <property name="driverClassName" value="${jdbc.driver}" /> <!-- url --> <property name="url" value="${jdbc.url}" /> <!-- 使用者名稱 --> <property name="username" value="${jdbc.username}" /> <!-- 密碼 --> <property name="password" value="${jdbc.password}" /> </bean>
maven
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency>
開源是一種精神,分享是一種態度,而這,正是 Java 語言幾十年依舊屹立不倒的原因。
Reference:
https://blog.csdn.net/LLLLLiSHI/article/details/71427791
https://www.jianshu.com/p/53de4b76f98c
轉載請並標註: “本文轉載自 linkedkeeper.com ”