本文简单介绍汇总常见java应用中使用到的JDBC资源池连接管理框架/库和基本的配置使用方式,包括典型的商用中间件和开源库。
目前社区存在大量的开源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)的值。
最新版本为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是一个封装基础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是阿里开源的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已经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>