幾種常見的JDBC連接池管理工具和配置

幾種常見的JDBC連接池管理工具和配置

本文簡單介紹彙總常見java應用中使用到的JDBC資源池連接管理框架/庫和基本的配置使用方式,包括典型的商用中間件和開源庫。

商用中間件


BES Application Server


BES應用服務器的JDBC資源池配置都在中間件的domain.config裏面,典型的JDBC連接池配置段如下:
    <jdbc-connection-pool connection-validation-method="table" statement-cache-size="0" associate-with-thread="false" connection-leak-reclaim="false" connection-test-period="5000" validate-atmost-once-period-in-seconds="120" max-connection-age="0" lazy-connection-enlistment="false" connection-creation-retry-interval-in-seconds="10" idle-timeout="300" datasource-classname="org.apache.derby.jdbc.ClientDataSource" sql-execution-alarm-threshold="0" is-isolation-level-guaranteed="false" max-pool-size="32" res-type="javax.sql.DataSource" name="DerbyPool" is-connection-validation-required="false" match-connections="false" object-type="user" fail-all-connections="false" ping="false" allow-non-component-callers="false" test-on-borrow="false" statement-timeout-in-seconds="-1" non-transactional-connections="false" lazy-connection-association="false" max-wait-time-in-millis="60000" connection-creation-retry-attempts="0" initial-pool-size="8" wrap-jdbc-objects="true" pooling="true" connection-leak-timeout-in-seconds="0" pool-bump-size="2" statement-leak-reclaim="false" statement-leak-timeout="0">
        <property name="PortNumber" value="1527"/>
        <property name="Password" value="{AES}l81RLwPCVWrFjyA6GP2bkw=="/>
        <property name="User" value="APP"/>
        <property name="serverName" value="localhost"/>
        <property name="DatabaseName" value="bes-appserv-samples"/>
        <property name="connectionAttributes" value=";create=true"/>
        </jdbc-connection-pool>

Oracle Weblogic


Weblogic的JDBC資源池配置在域控制器的config/jdbc子目錄下存儲,一般每個數據源對應一個xml文件。比如如下典型配置文件(config/jdbc/examples-oracleXA-jdbc.xml):
    <?xml version="1.0" encoding="UTF-8"?>
    <jdbc-data-source xsi:schemaLocation="http://www.bea.com/ns/weblogic/90/domain.xsd" xmlns="http://xmlns.oracle.com/weblogic/jdbc-data-source" xmlns:sec="http://www.bea.com/ns/weblogic/90/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wls="http://www.bea.com/ns/weblogic/90/security/wls">
    <name>examples-oracleXA</name>
    <jdbc-driver-params>
        <url>jdbc:oracle:thin:@samples:1521:samples</url>
        <driver-name>oracle.jdbc.xa.client.OracleXADataSource</driver-name>
        <properties>
        <property>
            <name>user</name>
            <value>scott</value>
        </property>
        </properties>
        <password-encrypted>{AES}emNi92PHcG8wLa4KwfmcVefacyG2gGu8thii2+ttrew=</password-encrypted>
    </jdbc-driver-params>
    <jdbc-connection-pool-params>
        <test-table-name>dual</test-table-name>
    </jdbc-connection-pool-params>
    <jdbc-data-source-params>
        <jndi-name>examples-dataSource-oracleXAPool</jndi-name>
        <global-transactions-protocol>TwoPhaseCommit</global-transactions-protocol>
    </jdbc-data-source-params>
    </jdbc-data-source>


開源框架

目前社區存在大量的開源JDBC連接池管理框架,常見的有:DBCP 、C3P0、BoneCP、Proxool、DDConnectionBroker、DBPool、XAPool、Primrose、SmartPool、MiniConnectionPoolManager及Druid等–https://www.open-open.com/project/tag/shuju-lianjiechi.html
這些開源庫都可以在spring中通過直接配置bean,或者屬性文件的方式進行配置。 通過屬性文件配置時將連接池的參數放在.properties屬性文件,這裏可以添加大量自定義參數。參數的讀取一般寫到applicationContext.xml的文件中,通過org.springframework.beans.factory.config.PropertyPlaceholderConfigurer類將.properties(key/value形式)文件中設定的值在xml中替換爲佔位該鍵($key)的值。

DBCP

最新版本爲Apache Commons DBCP 2.6.0 for JDBC 4.2 on Java 8 – http://commons.apache.org/proper/commons-dbcp/configuration.html。 通常在spring框架裏面配置實用dbcp管理的JDBC池。典型配置如下:


    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd">

        
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/spring_database"></property>
        <property name="username" value="root"></property>
        <property name="password" value="362427gg"></property>
    </bean>
    <bean id="userdao" class="com.heima_jdbctemplate_dbcp.UserDao">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    </beans>

C3P0

C3P0是一個封裝基礎JDBC驅動實現DataSource和連接池管理、支持JNDI綁定的一個簡單易用的jdbc池管理庫,最新版本爲0.9.5.4 – https://github.com/swaldman/c3p0。 通常在spring框架中bean的配置如下:

        <bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
            <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/c3p0jdbctemplate"></property>
        <property name="user" value="root"></property>
        <property name="password" value="jay571018"></property>
    </bean>  

Druid

Druid是阿里開源的JDBC資源池管理庫,提供了多種數據庫的優化,內置包括了SQL Parser、ProxyDriver。提供了監控和數據庫密碼加密管理的功能-- https://github.com/alibaba/druid。 典型的spring框架中bean配置如下:

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> 
        <!-- 基本屬性 url、user、password -->
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc_url}" />
        <property name="username" value="${jdbc_user}" />
        <property name="password" value="${jdbc_password}" />

        <!-- 配置監控統計攔截的filters -->
        <property name="filters" value="stat" />

        <!-- 配置初始化大小、最小、最大 -->
        <property name="maxActive" value="20" />
        <property name="initialSize" value="1" />
        <property name="minIdle" value="1" />

        <!-- 配置獲取連接等待超時的時間 -->
        <property name="maxWait" value="60000" />     

        <!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閒連接,單位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />

        <!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000" />

        <property name="testWhileIdle" value="true" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />

        <!-- 打開PSCache,並且指定每個連接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="true" />
        <property name="maxOpenPreparedStatements" value="20" />
    </bean>

如果需要對密碼進行加密,可以使用Druid的ConfigFilter進行加解密和其他設置。詳見 https://github.com/alibaba/druid/wiki/使用ConfigFilter

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <property name="url" value="jdbc:derby:memory:spring-test;create=true" />
        <property name="username" value="sa" />
        <property name="password" value="${password}" />
        <property name="filters" value="config" />
        <property name="connectionProperties" value="config.decrypt=true;config.decrypt.key=${publickey}" />
    </bean>

BoneCP/HikariCP

BoneCP和HikariCP都是通過解決池管理環境下資源競爭問題來達到高性能連接管理的目的。目前BoneCP已經deprecated,作者推薦使用HikariCP – https://github.com/brettwooldridge/HikariCP

可以通過如下配置文件(比如jdbc.properties)進行配置:

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql://localhost:3306/webgate?autoReconnect=true&rewriteBatchedStatements=true
    jdbc.user=webgate
    jdbc.password=111111
    jdbc.testSQL=select 2
    jdbc.minConn=5
    jdbc.maxConn=20
    jdbc.connTimeout=10000

典型的spring框架的bean配置(比如 applicationContext.xml)如下:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>jdbc.properties</value>
            </list>
        </property>
    </bean>


    <bean id="dsHikariCP" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown">
    <property name="driver" value="${jdbc.driver}" />
    <property name="user" value="${jdbc.user}" />
    <property name="password" value="${jdbc.password}" />
    <property name="testSQL" value="${jdbc.testSQL}" />
    <property name="minConn" value="${jdbc.minConn}" />
    <property name="maxConn" value="${jdbc.maxConn}" /> 
    <property name="connTimeout" value="${jdbc.connTimeout}" /> 
    </bean>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章