1. 程式人生 > >資料庫連線池對比

資料庫連線池對比

1.資料庫連線池概述

資料庫連線的建立是一種耗時、效能低、代價高的操作,頻繁的資料庫連線的建立和關閉極大的影響了系統的效能。資料庫連線池是系統初始化過程中建立一定數量的資料庫連線放於連線池中,當程式需要訪問資料庫時,不再建立一個新的連線,而是從連線池中取出一個已建立的空閒連線,使用完畢後,程式將連線歸還到連線池中,供其他請求使用,從而實現的資源的共享,連線的建立、斷開都由連線池自身來管理。

資料庫連線池為系統的執行帶來了以下優勢:昂貴的資料庫連線資源得到重用;減少了資料庫連線建立和釋放的時間開銷,提高了系統響應速度;統一的資料庫連線管理,避免了連線資源的洩露。

資料庫連線池執行機制:

系統初始化時建立連線池,程式操作資料庫時從連線池中獲取空閒連線,程式使用完畢將連線歸還到連線池中,系統退出時,斷開所有資料庫連線並釋放記憶體資源。

2.主流資料庫連線池比較

常用的主流開源資料庫連線池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等

C3p0: 開源的JDBC連線池,實現了資料來源和JNDI繫結,支援JDBC3規範和JDBC2的標準擴充套件。目前使用它的開源專案有Hibernate、Spring等。單執行緒,效能較差,適用於小型系統,程式碼600KB左右。

DBCP (Database Connection Pool):由Apache開發的一個Java資料庫連線池專案, Jakarta commons-pool物件池機制,Tomcat使用的連線池元件就是DBCP。單獨使用dbcp需要3個包:common-dbcp.jar,common-pool.jar,common-collections.jar,預先將資料庫連線放在記憶體中,應用程式需要建立資料庫連線時直接到連線池中申請一個就行,用完再放回。單執行緒,併發量低,效能不好,適用於小型系統。

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。

BoneCP:官方說法BoneCP是一個高效、免費、開源的Java資料庫連線池實現庫。設計初衷就是為了提高資料庫連線池效能,根據某些測試資料顯示,BoneCP的速度是最快的,要比當時第二快速的連線池快25倍左右,完美整合到一些持久化產品如Hibernate和DataNucleus中。BoneCP特色:

高度可擴充套件,快速;連線狀態切換的回撥機制;允許直接訪問連線;自動化重置能力;JMX支援;懶載入能力;支援XML和屬性檔案配置方式;較好的Java程式碼組織,100%單元測試分支程式碼覆蓋率;程式碼40KB左右。

Druid:Druid是Java語言中最好的資料庫連線池,Druid能夠提供強大的監控和擴充套件功能,是一個可用於大資料實時查詢和分析的高容錯、高效能的開源分散式系統,尤其是當發生程式碼部署、機器故障以及其他產品系統遇到宕機等情況時,Druid仍能夠保持100%正常執行。主要特色:為分析監控設計;快速的互動式查詢;高可用;可擴充套件;Druid是一個開源專案,原始碼託管在github上。

主流連線池各項功能對比如下:

3.資料庫連線池Spring整合配置與JNDI配置

下面針對每一種連線池的使用方法,在開發中如何配置給出spring整合配置和在tomcat的conf/context.xml檔案中配置2種方式,限於篇幅只給出基本引數,詳細引數可自行研究。

3.1 阿里Druid連線池

Maven依賴

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.28</version>
</dependency>

Spring整合配置方式

  1. <!--Spring Druid 資料來源配置-->
  2.     <beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"init-method="init"destroy-method="close">
  3.         <!-- 基本屬性 url、user、password -->
  4.         <propertyname="url"value="${jdbc.url}"/>
  5.         <propertyname="username"value="${jdbc.username}"/>
  6.         <propertyname="password"value="${jdbc.password}"/>
  7.         <!-- 配置初始化大小、最小、最大 -->
  8.         <propertyname="initialSize"value="1"/>
  9.         <propertyname="minIdle"value="1"/>
  10.         <propertyname="maxActive"value="20"/>
  11.         <!-- 配置獲取連線等待超時的時間 -->
  12.         <propertyname="maxWait"value="60000"/>
  13.         <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連線,單位是毫秒 -->
  14.         <propertyname="timeBetweenEvictionRunsMillis"value="60000"/>
  15.         <!-- 配置一個連線在池中最小生存的時間,單位是毫秒 -->
  16.         <propertyname="minEvictableIdleTimeMillis"value="300000"/>
  17.         <!-- 開啟PSCache,並且指定每個連線上PSCache的大小 -->
  18.         <propertyname="poolPreparedStatements"value="true"/>
  19.         <propertyname="maxPoolPreparedStatementPerConnectionSize"value="20"/>
  20.         <!-- 配置監控統計攔截的filters,去掉後監控介面sql無法統計 -->
  21.         <propertyname="filters"value="stat"/>
  22.     </bean>
  23.     Web.xml配置  
  24.      <!--druid WebStatFilter用於採集web-jdbc關聯監控的資料-->
  25.       <filter>
  26.         <filter-name>DruidWebStatFilter</filter-name>
  27.         <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
  28.         <init-param>
  29.           <param-name>exclusions</param-name>
  30.           <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
  31.         </init-param>
  32.       </filter>
  33.       <filter-mapping>
  34.         <filter-name>DruidWebStatFilter</filter-name>
  35.         <url-pattern>/*</url-pattern>
  36.       </filter-mapping>
  37.       <!--druid訪問監控介面 /druid/index.html-->
  38.       <servlet>
  39.         <servlet-name>DruidStatView</servlet-name>
  40.         <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  41.       </servlet>
  42.       <servlet-mapping>
  43.         <servlet-name>DruidStatView</servlet-name>
  44.         <url-pattern>/druid/*</url-pattern>
  45.       </servlet-mapping>

Tomcat中context.xml檔案JNDI配置方式

com.alibaba.druid.pool.DruidDataSourceFactory實現了javax.naming.spi.ObjectFactory,可以作為JNDI資料來源來配置
<TOMCAT_HOME>/conf/context.xml配置JNDI方式

  1. <Resource
  2.         name="jdbc/MysqlDataSource"
  3.         factory="com.alibaba.druid.pool.DruidDataSourceFactory"
  4.         auth="Container"
  5.         type="javax.sql.DataSource"
  6.         driverClassName="com.mysql.jdbc.Driver"
  7.         url="jdbc:mysql://192.168.1.233:3306/lead_oams?useUnicode=true&characterEncoding=utf-8"
  8.         username="lead_system"
  9.         password="password"
  10.         maxActive="50"
  11.         maxWait="10000"
  12.         removeabandoned="true"
  13.         removeabandonedtimeout="60"
  14. 相關推薦

    Druid以及Druid和常見的資料庫連線對比(轉載 )

    寫的灰常好非常細,關鍵是還有各種資料庫連線池的對比,條理比較清晰。 1. Druid是什麼? Druid是Java語言中最好的資料庫連線池。Druid能夠提供強大的監控和擴充套件功能。 2. 在哪裡下載druid 3. 怎麼獲取Druid的原始碼 Druid

    資料庫連線對比

    1.資料庫連線池概述資料庫連線的建立是一種耗時、效能低、代價高的操作,頻繁的資料庫連線的建立和關閉極大的影響了系統的效能。資料庫連線池是系統初始化過程中建立一定數量的資料庫連線放於連線池中,當程式需要訪問資料庫時,不再建立一個新的連線,而是從連線池中取出一個已建立的空閒連線,

    資料庫連線理解和對比

    資料庫連線池的實現及原理:https://www.cnblogs.com/wym789/p/6374440.html 使用jdbc-pool替代dbcp、c3p0等連線池的原因: https://blog.csdn.net/u011267070/article/details/5218593

    Java資料庫連線細節探討

    我們知道,資料庫連線池可以把資料庫的連線快取起來,下次使用的話可以直接取到快取起來的資料庫連線。那麼,在這個過程中有幾個細節需要注意: 1、資料庫的連線數有沒有限制? 2、資料庫會不會自動斷開已經建立的連線? 3、如果資料庫重啟了,但應用沒有重啟,那麼資料庫連線池中的所有連線都不可用了,

    JavaWeb_day10_資料庫連線_c3p0_DBUtils

    1.在實際開發中,“獲取連線”和“釋放資源”是很消耗系統資源的兩個過程,為了解決此問題,採用連線池技術,共享連線connection 2.連線池概念 3.Java的資料庫連線池的公共介面:javax.sql.DataSource 常見的連線池:DBCP   C3

    手寫資料庫連線附gp連線jar包地址

      手寫資料庫連線並,測試.   最近資料庫要連線GP資料庫(GreenplumSQL),在建立連線的時候需要做建立不同的連線數量. 其實當想到寫資料庫連線時,完全可以通過springdata jpa直接寫介面,這是一種思路. 所以在使用的使用,就寫了個dem

    JDBC資料庫連線連線資料庫資料庫操作DAO層設計通用更新及查詢方法(二)

    上篇文章主要介紹了通過資料庫連線池連線資料庫,然後設計了對資料庫通用更新和查詢方法,本篇文章主要通過例項介紹上篇文章定義的對資料庫操作的幾個方法的使用:     首先我們先在資料庫建立一個學生資訊表Student欄位如圖: 建立好表將配置檔案的資訊改好然後需要建立一

    JDBC資料庫連線連線資料庫資料庫操作DAO層設計通用更新及查詢方法(一)

    該篇文章介紹了資料庫連線池獲取資料庫連線以及資料庫操作的基本使用,然後主要提供了java專案案例中dao層的一種設計,利用反射的原理定義了通用的查詢方法可以對應所有的表和例項。文章中的每段程式碼都提供了詳細的註釋及邏輯步驟 首先匯入資料庫連線的所需要的jar包:    

    springboot配置預設資料庫連線並解決初始連線未生效問題

    目前Spring Boot中預設支援的連線池有dbcp,dbcp2, tomcat, hikari三種連線池。  在springboot1.5之前預設tomcat連線池, 版本org.springframework.boot.autoconfigure.jdbc.Data

    JFinal配置資料庫連線外掛和表類對映

    配置資料庫連線池外掛,此處以Druid為例,還需要配置資料庫訪問外掛,即ActiveRecord外掛,用於建立資料庫中Table和Java Bean的mapping對映: public void configPlugin(Plugins me) { // 配置 druid

    druid 資料庫連線的詳細配置

    首先說一下自己程式中遇到的問題,前一段時間新寫了一個專案,主要架構改進,為前端提供介面(spring +springmvc+mybatis) 在新專案中使用的是阿里的druid連線池,配置簡單,除了資料庫地址,驅動類,使用者名稱和密碼其他一起都是預設,開始的時候由於專案更新上線頻率比較多,沒有出現太

    資料庫連線-資料來源配置

    常用的c3p0,DBPC,Druid三大連線池 DBPC <!-- 配置dbcp資料來源 --> <bean id="dataSource2" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSourc

    Java配置資料庫連線

    dbcp資料庫連線池 DbcpUtils.java import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; impor

    python單例與資料庫連線

     單例:專業用來處理連線多的問題(比如連線redis,zookeeper等),全域性只有一個物件   單例程式碼def singleton(cls): instances = {} def _singleton(*args, **kwargs)

    三大資料庫連線分析

    先來點實用的: <!-- 配置dbcp資料來源 --> <bean id="dataSource2" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <

    資料庫連線之DB2

       最近專案開發遇到一個問題,當資料量過大時會導致系統崩潰,經過排查,發現是每一次操作資料庫都建立一次資料連線,當資料量太大,就會導致程式無法負載從而宕機。 而後進行程式碼改造,改用資料庫連線池。目前使用資料庫連線池有兩種方式,使用配置檔案以及不使用配置檔案!   第一種:  不使

    HikariCP 的Java資料庫連線介紹及配置

    HiKariCP是資料庫連線池的一個後起之秀,號稱效能最好,可以完美地PK掉其他連線池。 原文地址:http://blog.csdn.net/clementad/article/details/46928621 官網:https://github.com/brettwooldridge/Hi

    資料庫連線認知+手寫一個

    首先推薦一篇不錯的文章。https://www.cnblogs.com/newpanderking/p/3875749.html 接下來,看了這篇文章之後,我們再看一下 1.首先是連線池的規範 /** * 連線池 頂級規範 */ public interface IPool {

    ThreadLocal解決事務執行緒安全問題(c3p0資料庫連線工具類)

    ThreadLocal底層是Map集合,它的key是當前執行緒,value由自己設定,可以繫結Connection或其他物件等,保證本次同一執行緒使用同一Connection。 ThreadLocal類提供幾個方法: get/set/remove 以下是ThreadLocal搭配c3p

    資料庫預設連線數 遠遠 大於 資料庫連線的 連結數,為什麼還要使用資料庫連線

    1. 資料庫的讀寫能力與計算機硬體相關, 所以連結太多,資料庫也不能一下子處理。連線數超過資料庫最大連線數,連結就會等待,超時就會報錯。 2. 建立連結很浪費資源。資料庫連線池保持現有連線後不會再建立連線池,而是複用這些連結。 3. 如果併發超過連線池連線數,則連結排隊等待,直到空出連結。 4.如果