1. 程式人生 > >c3p0、dbcp、tomcat jdbc pool 連線池區別(推薦使用jdbc pool)

c3p0、dbcp、tomcat jdbc pool 連線池區別(推薦使用jdbc pool)

檢視資料,得知dbcp和c3p0都是單執行緒的,在高併發的環境下效能會非常低下,

決定換用tomcat自帶的jdbc-pool,關於jdbc-pool的專案介紹

   <!--  class="org.apache.tomcat.dbcp.dbcp.BasicDataSource" -->
    <!--  class="org.springframework.jdbc.datasource.DriverManagerDataSource" -->
       <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" parent="c3p0DataSource">

Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做為連線池的實現,但是 dbcp 飽受詬病,原因有:

  1. dbcp 是單執行緒的,為了保證執行緒安全會鎖整個連線池
  2. dbcp 效能不佳
  3. dbcp 太複雜,超過 60 個類
  4. dbcp 使用靜態介面,在 JDK 1.6 編譯有問題
  5. dbcp 發展滯後

因此很多人會選擇一些第三方的連線池元件,例如 c3p0 , bonecpdruid (@wenshao ) 等。

為此,Tomcat 從 7.0 開始引入一個新的模組:Tomcat jdbc pool

  1. tomcat jdbc pool 近乎相容 dbcp ,效能更高
  2. 非同步方式獲取連線
  3. tomcat jdbc pool 是 tomcat 的一個模組,基於 tomcat JULI,使用 Tomcat 的日誌框架
  4. 使用 javax.sql.PooledConnection 介面獲取連線
  5. 支援高併發應用環境
  6. 超簡單,核心檔案只有8個,比 c3p0 還
  7. 更好的空閒連線處理機制
  8. 支援 JMX
  9. 支援 XA Connection

tomcat jdbc pool 的優點遠不止這些,詳情請看這裡

tomcat jdbc pool 可在 Tomcat 中直接使用,也可以在獨立的應用中使用。

推薦使用
    <!-- JDBC連線池 、資料來源 -->

    <bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
      <property name="driverClassName" value="${jdbc.driverClassName}" />
      <property name="url" value="${jdbc.url}" />
      <property name="username" value="${jdbc.username}" />
      <property name="password" value="${jdbc.password}" />
      <property name="testWhileIdle" value="true" />
      <property name="testOnBorrow" value="true" />
      <property name="testOnReturn" value="false" />
      <property name="validationQuery" value="SELECT 1" />
      <property name="validationInterval" value="30000" />
      <property name="timeBetweenEvictionRunsMillis" value="30000" />
      <property name="maxActive" value="100" />
      <property name="minIdle" value="2" />
      <property name="maxWait" value="10000" />
      <property name="initialSize" value="4" />
      <property name="removeAbandonedTimeout" value="60" />
      <property name="removeAbandoned" value="true" />
      <property name="logAbandoned" value="true" />
      <property name="minEvictableIdleTimeMillis" value="30000" />
      <property name="jmxEnabled" value="true" />
    </bean>

引入Maven依賴:
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-jdbc</artifactId>
    <version>7.0.29</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-juli</artifactId>
    <version>7.0.29</version>
</dependency>


tomcat-dbcp與commons-dbcp有什麼區別

The default database connection pool implementation in Apache Tomcat relies on the libraries from the Apache Commons project. The following libraries are used:
Commons DBCP
Commons Pool
These libraries are located in a single JAR at $CATALINA_HOME/lib/tomcat-dbcp.jar. However, only the classes needed for connection pooling have been included, and the packages have been renamed to avoid interfering with applications.
以上是tomcat7.x的幫助文件,大意是tomcat-dbcp.jar包含了commons-dbcp和Commons Pool的內容,當然也只僅僅包含了需要資料庫連線的部分,而不是全部