java数据连接池 c3p0 dbcp proxool


Java 框架数据库连接池比较(c3p0,dbcp和框架数据库连接池比较(proxool))现在常用的开源数据连接池主要有
c3p0,dbcp 和 proxool 三种其中:
hibernate 开发组推荐使用 c3p0;
spring 开发组推荐使用dbcp (dbcp 连接池有 weblogic 连接池同样的 问题,就是强行关闭连接或数据库重启后,无法 reconnect告诉连接被重置,这 个设置可以解决);
hibernate in action 推荐使用 c3p0 和 proxool;
下面具体就每种连接池的调研结果进行说明:
1. Apache-DBCP ? BasicDataSource 相关的参数说明
dataSource: 要连接的 datasource (通常我们不会定义在 server.xml)
defaultAutoCommit:对于事务是否 autoCommit, 默认值为 true
defaultReadOnly: 对于数据库是否只能读取, 默认值为 false
driverClassName:连接数据库所用的 JDBC Driver Class,
maxActive:可以从对象池中取出的对象最大个数,为 0 则表示没有限制,默认为 8
maxIdle: 最大等待连接中的数量,设 0 为没有限制(对象池中对象最大个数)
minIdle:对象池中对象最小个数
maxWait: 最大等待秒数, 单位为 ms, 超过时间会丟出错误信息
password: 登陆数据库所用的密码
url: 连接数据库的 URL
username: 登陆数据库所用的帐号
validationQuery: 验证连接是否成功, SQL SELECT 指令至少要返回一行
removeAbandoned: 是否自我中断,默认是 false
removeAbandonedTimeout: 几秒后会自我中断, removeAbandoned 必须为 true
logAbandoned: 是否记录中断事件, 默认为 false
minEvictableIdleTimeMillis:大于 0进行连接空闲时间判断,或为 0,对空闲 的连接不进行验证;默认 30 分钟
timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于 0, 不会启动检查线程,默认-1
testOnBorrow:取得对象时是否进行验证,检查对象是否有效,默认为 false
testOnReturn:返回对象时是否进行验证,检查对象是否有效,默认为 false
testWhileIdle:空闲时是否进行验证,检查对象是否有效,默认为 false ? 在使用 DBCP的时候,如果使用默认值,则数据库连接因为某种原因断掉后,
   再从 连接池中取得连接又不进行验证, 这时取得的连接实际上就会是无效的数据库连接。因此为了防止获得的数据库连接失效,在使用的时候最好保证:
username: 登陆数据库所用的帐号
validationQuery:SELECT COUNT(*) FROM DUAL testOnBorrow、testOnReturn、testWhileIdle:最好都设为 true
minEvictableIdleTimeMillis:大于 0 ,进行连接空闲时间判断,或为 0,对空闲 的连接不进行验证
timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于 0, 不会启动检查线程 ? PS:在构造
GenericObjectPool [BasicDataSource 在其 createDataSource () 方 法中也会使用GenericObjectPool] 时,会生成一个内嵌类 Evictor,实现自 Runnable 接口。
如果timeBetweenEvictionRunsMillis 大于 0,每过 timeBetweenEvictionRunsMillis 毫秒
Evictor 会调用 evict()方法, 检查对象的闲 置时间是否大于 minEvictableIdleTimeMillis 毫秒(_minEvictableIdleTimeMillis 小于等于 0 时则忽略,默认为 30 分钟),是则销
毁此对象,否则就激活并校验对象,然后调用 ensureMinIdle 方法检查确保池中对 象个数不小于_minIdle。在调用
returnObject 方法把对象放回对象池,首先检查该 对象是否有效,然后调用 PoolableObjectFactory 的
passivateObject 方法使对象 处于非活动状态。再检查对象池中对象个数是否小于 maxIdle,是则可以把此对象
放回对象池,否则销毁此对象 ? 上述特性的可设置性已在代码中验证,具体性能是否能实现有待实际验证
2. C3P0 ? C3P0 的官方example 中使用的数据源为 ComboPooledDataSource,网上一篇文章 详细介绍了 C3P0
连接池配置中各项含义[这些配置项的含义在下载解压 c3p0 的压缩 包之后目录的 doc\index.html 中的 Configuration部分也有详细的介绍, 这里偷下 懒:P],现摘录如下:
<c3p0-config>
 <default-config>
  <!--当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数。Default: 3 -->
  <property name="acquireIncrement">3</property>
  <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
  <property name="acquireRetryAttempts">30</property>
  <!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
  <property name="acquireRetryDelay">1000</property>
  <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
  <property name="autoCommitOnClose">false</property>
  <!--c3p0 将建一张名为 Test 的空表,并使用其自带的查询语句进行测试。如果定 义了这个参数那么 属性 preferredTestQuery
   将被忽略。你不能在这张 Test 表上进行任何操作,它将 只供 c3p0 测试 使用。Default: null -->
  <property name="automaticTestTable">Test</property>
  <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据 源仍有效 保留,并在下次调用 getConnection()的时候继续尝试获取连接。如果设为
   true, 那么在尝试 获取连接失败后该数据源将申明已断开并永久关闭。Default: false -->
  <property name="breakAfterAcquireFailure">false</property>
   <!--当连接池用完时客户端调用 getConnection()后等待获取新连接的时间,超时后将抛出 SQLException,如设为 0 则无限期等待。单位毫秒。Default:0 -->
  <property name="checkoutTimeout">100</property>
  
  <!--通过实现 ConnectionTester 或 QueryConnectionTester的类来测试连接.类名 需制定全路径. Default:com.mchange.v2.c3p0.impl.DefaultConnectionTester -->
  <property name="connectionTesterClassName"></property>
  <!--指定 c3p0 libraries 的路径,如果(通常都是这样)在本地即可获得那么无需 设置,默认 null 即可 Default: null -->
  <property name="factoryClassLocation">null</property>
  <!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs. (文档原文)作者强烈建议不使用的一个属性 -->
  <property name="forceIgnoreUnresolvedTransactions">false</property>
   <!--每 60 秒检查所有连接池中的空闲连接。Default: 0 -->
  <property name="idleConnectionTestPeriod">60</property>
  <!--初始化时获取三个连接, 取值应在 minPoolSize 与 maxPoolSize 之间。 Default: 3 -->
  <property name="initialPoolSize">3</property>
  <!--最大空闲时间,60 秒内未使用则连接被丢弃。 若为 0 则永不丢弃。 Default: 0 -->
  <property name="maxIdleTime">60</property>
  <!--连接池中保留的最大连接数。Default: 15 -->
  <property name="maxPoolSize">15</property>
  <!--JDBC 的标准参数,用以控制数据源内加载的 PreparedStatements 数量。但由 于预缓存的 statements 属于单个
   connection 而不是整个连接池。 所以设置这个参数需要考虑到多方面的因 素。 如果 maxStatements 与 maxStatementsPerConnection
   均为 0,则缓存被关闭。 Default: 0 -->
  <property name="maxStatements">100</property>
  
  <!--maxStatementsPerConnection 定义了连接池内单个连接所拥有的最大缓存 statements 数。Default: 0 -->
  <property name="maxStatementsPerConnection"></property>
  <!--c3p0 是异步操作的,缓慢的 JDBC 操作通过帮助进程完成。扩展这些操作可以 有效的提升性能 通过多线程实现多个操作同时被执行。Default:
   3 -->
  <property name="numHelperThreads">3</property>
  <!--当用户调用 getConnection()时使 root 用户成为去获取连接的用户。主要用于 连接池连接非 c3p0 的数据源时。Default:
   null -->
  <property name="overrideDefaultUser">root</property>
   <!--与 overrideDefaultUser 参数对应使用的一个参数。Default: null -->
  <property name="overrideDefaultPassword">password</property>
   <!--密码。Default: null -->
  <property name="password"></property>
   <!--定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一显著提 高测试速度。注意: 测试的表必须在初始数据源的时候就存在。Default:
   null -->
  <property name="preferredTestQuery">select id from test where id=1</property>
  <!--用户修改系统配置参数执行前最多等待 300 秒。Default: 300 -->
  <property name="propertyCycle">300</property>
   <!--因性能消耗大请只在需要的时候使用它。 如果设为 true 那么在每个 connection 提交的 时候都将校验其有效性。建议使用 idleConnectionTestPeriod
   或 automaticTestTable 等方法来提升连接测试的性能。Default: false -->
  <property name="testConnectionOnCheckout">false</property>
  <!--如果设为 true 那么在取得连接的同时将校验连接的有效性。Default: false -->
  <property name="testConnectionOnCheckin">true</property>
  <!--用户名。Default: null -->
  <property name="user">root</property>
  <!--早期的 c3p0 版本对 JDBC 接口采用动态反射代理。在早期版本用途广泛的情况 下这个参数 允许用户恢复到动态反射代理以解决不稳定的故障。最新的非反射代理更快并且已
   经开始 广泛的被使用,所以这个参数未必有用。现在原先的动态反射与新的非反射代理同 时受到 支持,但今后可能的版本可能不支持动态反射代理。Default:false -->
  <property name="usesTraditionalReflectiveProxies">false</property>
  <property name="automaticTestTable">con_test</property>
  <property name="checkoutTimeout">30000</property>
  <property name="idleConnectionTestPeriod">30</property>
  <property name="initialPoolSize">10</property>
  <property name="maxIdleTime">30</property>
  <property name="maxPoolSize">25</property>
  <property name="minPoolSize">10</property>
  <property name="maxStatements">0</property>
  <user-overrides user="swaldman">
  </user-overrides>
 </default-config>
 <named-config name="dumbTestConfig">
  <property name="maxStatements">200</property>
  <user-overrides user="poop">
   <property name="maxStatements">300</property>
  </user-overrides>
 </named-config>
</c3p0-config>


<alias>
  总结 spring 下配置 dbcp,c3p0,proxool 数据 源链接池applicationContext-datasource-jdbc.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
 <beans default-autowire="no" default-lazy-init="true" default-dependency-check="none">
  <description>datasource</description>
  <!-- 
   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
    <property name="url"><value>${jdbc.url}</value></property>
    <property name="username"><value>${jdbc.username}</value></property>
    <property name="password"><value>${jdbc.password}</value></property>
   </bean>
  -->
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
   <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
   <property name="url"><value>${jdbc.url}</value></property>
   <property name="username"><value>${jdbc.username}</value></property>
   <property name="password"><value>${jdbc.password}</value></property>
   <property name="maxActive"><value>80</value></property>
   <property name="maxIdle"><value>20</value></property>
   <property name="maxWait"><value>3000</value></property>
  </bean>
  <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method= "close">
   <property name="driverClass"><value>${jdbc.driverClassName}</value></property>
   <property name="jdbcUrl"><value>${jdbc.url}</value></property>
      <property name="user"><value>${jdbc.username}</value></property>
      <property name="password"><value>${jdbc.password}</value></property>
   <property name="acquireIncrement"><value>5</value></property>
      <property name="idleConnectionTestPeriod"><value>3000</value></property>
   <property name="checkoutTimeout"><value>3000</value></property>
   <property name="maxPoolSize"><value>80</value></property>
   <property name="minPoolSize"><value>1</value></property>
   <property name="maxStatements"><value>6000</value></property>
   <property name="initialPoolSize"><value>5</value></property>
  </bean>
   <ComboPooledDataSource 参数说明 maxIdleTime: 最大空闲时间,60 秒内未使用则连接被丢弃。若为 0 则永不丢弃。Default: 0
                acquireIncrement: 当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数。Default: 3
                maxStatements: JDBC 的标准参数,用以控制数据源内加载的 PreparedStatements 数量。
                  但由于预缓存的 stateme nts 属于单个 connection 而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。
                  如果 maxStatements 与 maxStatementsPerConnection 均为 0,则缓存被关闭。Default: 0
                idleConnectionTestPeriod: 每 60 秒检查所有连接池中的空闲连接。Default: 0
                acquireRetryAttempts: 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30
                breakAfterAcquireFailure: 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,
                  并在下次调用 getConnection()的时候继续尝试获取连接。如果设为 true,那么在尝试
                  获取连接失败后该数据源将申明已断开并永久关闭。Default: false
                testConnectionOnCheckout:因性能消耗大请只在需要的时候使用它。如果设为 true 那么在每个 connection 提交的时候都将校
                 验其有效性。建议使用 idleConnectionTestPeriod 或 automaticTestTable 等方法来提升连接测试的性能。Default: false>
  <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
   <property name="driver"><value>${jdbc.driverClassName}</value></property>
   <property name="driverUrl"><value>${jdbc.url}</value></property>
   <property name="user"><value>${jdbc.username}</value></property>
   <property name="password"><value>${jdbc.password}</value></property>
   <property name="alias"><value>test</value></property>
   <property name="houseKeepingSleepTime"><value>90000</value></property>
   <property name="prototypeCount"><value>10</value></property>
   <property name="maximumConnectionCount"><value>100</value></property>
   <property name="minimumConnectionCount"><value>10</value></property>
      <property name="trace"><value>true</value></property>
      <property name="verbose"><value>true</value></property>
  </bean>
 </beans>

 tomcat 下配置数据库连接池 DBCP、C3P0、 、 、 Proxool
 1、将连接池的 jar 文件拷贝到 tomcat 的 lib 目录下 、
   (1)dbcp: tomcat 默认包含tomcat-dbcp.jar,如果使用 tomcat 自带的 dbcp 则不用拷贝 jar 文件。 如果要使用 commons-dbcp连接池,则要将 commons-dbcp-xxx.jar 和 commons-pool.jar 拷贝到 tomcat 的 lib 目录下。
    (2)c3p0: 拷贝 c3p0-xx.jar 到 tomcat 的 lib 目录下
    (3)proxool: 拷贝proxool-xx.jar、 proxool-cglib.jar、 commons-logging-xxx.jar 到 tomcat 的lib 目录下
 2、打开 tomcat 的 context.xml,进行如下配置: 、 ,进行如下配置: <!--dbcp -->
 <Resource name="jdbc/mysqlds-dbcp" auth="Container" type="javax.sql.DataSource"
  factory="org.apache.commons.dbcp.BasicDataSourceFactory"<!--这里使用 的 commons-dbcp 连接池 --> <!--tomcat 的 dbcp 对应的 factory 为:将 commons 替换为 tomcat,也可不用配 置 -->
  driverClassName="com.mysql.jdbc.Driver"
  url="jdbc:mysql://localhost:3306/test" username="root" password=""
  maxActive="100" maxIdle="30" maxWait="10000" >
 </Resource> <!--c3p0 -->
 <Resource auth="Container" description="DB Connection"
  driverClass="com.mysql.jdbc.Driver" maxPoolSize="100" minPoolSize="2"
  acquireIncrement="2" name="jdbc/mysqlds-c3p0" user="root" password=""
  factory="org.apache.naming.factory.BeanFactory" type="com.mchange.v2.c3p0.ComboPooledDataSource"
  jdbcUrl="jdbc:mysql://localhost:3306/test" /> <!--proxool -->
 <Resource name="jdbc/mysqlds-proxool" auth="Container"
  type="javax.sql.DataSource" factory="org.logicalcobwebs.proxool.ProxoolDataSource"
  proxool.alias="test" user="root" password="" delegateProperties="foo=1,bar=true"
  proxool.jndi-name="mysqljndi" proxool.driver-url="jdbc:mysql://127.0.0.1:3306/test"
  proxool.driver-class="com.mysql.jdbc.Driver"
  proxool.house-keeping-sleep-time="900000" proxool.maximum-active-time="5"
  proxool.prototype-count="3" proxool.statistics="1m,15m,1d"
  proxool.simultaneous-build-throttle="10"
  proxool.minimum-connection-count="5" proxool.maximum-connection-count="15" />
 3、在 web.xml 中配置如下代码: 、 中配置如下代码:
 <resource-ref>
  <res-ref-name>jdbc/mysqlds-proxool</res-ref-name>
  <!-- context.xml 下的 Resources 的 name 属性一致-->
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
 </resource-ref>
 <!--与
     4、获取连接 java 代码: 、 代码: Context context = new InitialContext();
        ds =(DataSource) context.lookup("java:/comp/env/jdbc/mysqlds-proxool");
        //与 context.xml下的 Resources 的 name 属性一致
     5、常见问题: 、常见问题:
       (1)create a new connection but it fail its test: 在配置 proxool 连接池时,可能会包以上错误,
                  可以看看你的 context.xml 配置,将 proxool.test-before-use="true"该行去掉即可,即在使用前不要进行测试
  DBCP,C3P0,Proxool,BoneCP 参数介绍
  1、Apache-DBCP: : dataSource: 要连接的 datasource
    (通常我们不会定义在 server.xml)
  defaultAutoCommit: 对于事务是否 autoCommit, 默认值为 true
  defaultReadOnly:对于数据库是否只能读取, 默认值为 false
  driverClassName:连接数据库所用的 JDBC Driver Class,
  maxActive:可以从对象池中取出的对象最大个数,为 0 则表示没有限制,默认为 8
  maxIdle: 最大等待连接中的数量,设 0 为没有限制 (对象池中对象最大个数)
  minIdle:对象池中对象最小个数
     maxWait: 最大等待秒数, 单位为 ms, 超过时间会丟出错误信息
     password: 登陆数据库所用的密码
  url: 连接数据库的 URL
  username: 登陆数据库所用的帐号
  validationQuery: 验证连接是否成功, SQL SELECT 指令至少要返回一行 removeAbandoned: 是否自我中断, 默认是 false
  removeAbandonedTimeout: 几秒后会自我中断, removeAbandoned 必须为 true
  logAbandoned: 是否记录中断事件, 默认为 false
  minEvictableIdleTimeMillis:大于 0 ,进行连接空闲时间判断,或为 0,对空闲的连接不进 行验证;默认 30 分钟
  timeBetweenEvictionRunsMillis:失效检查线程运行时间间隔,如果小于等于 0,不会启动检 查线程,默认-1
  testOnBorrow:取得对象时是否进行验证,检查对象是否有效,默认为 false
  testOnReturn:返回对象时是否进行验证,检查对象是否有效,默认为 false
  testWhileIdle:空闲时是否进行验证,检查对象是否有效,默认为 false
  initialSize:初始化线程数
  2、C3P0:
     acquireIncrement: 当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数Default: 3
     acquireRetryAttempts: 定义在从数据库获取新连接失败后重复尝试的次数。Default: 30
     acquireRetryDelay: 两次连接中间隔时间,单位毫秒。Default: 1000
     autoCommitOnClose: 连接关闭时默认将所有未提交的操作回滚。Defaul t: false
     automaticTestTable:c3p0 将建一张名为 Test 的空表,并使用其自带的查询语句进行测试。如 果定义了这个参数那么属性 preferredTestQuery 将被忽略。你不能在这张
  Test 表上进行任何 操作,它将只供 c3p0 测试使用。Default: null
  breakAfterAcquireFailure: 获取连接失败将会引起所有等待连接池来获取连接的线程抛出异 常。但是数据源仍有效保留,
    并在下次调用 getConnection()的时候继续尝试获取连接。如果 设为 true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false
  checkoutTimeout:当连接池用完时客户端调用 getConnection()后等待获取新连接的时间,超 时后将抛出 SQLException,如设为 0 则无限期等待.单位毫秒。Default: 0
  connectionTesterClassName: 通过实现 ConnectionTester 或 QueryConnectionT ester 的类来测试 连接。类名需制定全路径。Default: com.mchange.v2.c3p0.impl.Def
  aultConnectionTester factoryClassLocation: 指定 c3p0 libraries 的路径,如果(通常都是这样)在本地即可获得那 么无需设置,默认 null 即可 Default: null
  idleConnectionTestPeriod: 每 60 秒检查所有连接池中的空闲连接。Defaul t: 0
  initialPoolSize: 初始化时获取三个连接, 取值应在 minPoolSize 与 maxPoolSize 之间。 Default: 3
  maxIdleTime: 最大空闲时间,60 秒内未使用则连接被丢弃。若为 0 则永不丢弃。Default: 0
  maxPoolSize: 连接池中保留的最大连接数。Default: 15
  maxStatements: JDBC 的标准参数, 用以控制数据源内加载的 PreparedSt atements 数量。 但由 于预缓存的 statements 属于单个 connection 而不是整个连接池。
   所以设置这个参数需要考虑 到多方面的因素。 如果 maxStatements 与 maxStatementsPerConnection 均为 0, 则缓存被关闭。 Default: 0
  maxStatementsPerConnection: maxStatementsPerConnection 定义了连接池内单个连接所拥有 的最大缓存 statements 数。Default: 0
  numHelperThreads:c3p0 是异步操作的,缓慢的 JDBC 操作通过帮助进程完成。扩展这些操 作可以有效的提升性能通过多线程实现多个操作同时被执行。Default: 3
  overrideDefaultUser:当用户调用 getConnection()时使 root 用户成为去获取连接的用户。主 要用于连接池连接非 c3p0 的数据源时。Default: null
  overrideDefaultPassword:与 overrideDefaultUser 参数对应使用的一个参数。Default: null
  password:密码。Default: null
  user:用户名。Default: null
  preferredTestQuery:定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个一 显著提高测试速度。注意:测试的表必须在初始数据源的时候就存在。Default: null
  propertyCycle:用户修改系统配置参数执行前最多等待 300 秒。Defaul t: 300
  testConnectionOnCheckout:因性能消耗大请只在需要的时候使用它。如果设为 true 那么在 每个 connection 提交的时候都将校验其有效性。建议使用 idleConnectio nTestPeriod 或 automaticTestTable 等方法来提升连接测试的性能。Default: false
  testConnectionOnCheckin: 如果设为 true 那么在取得连接的同时将校验连接的有效性。 Default: false
  3、Proxool:
     acquireIncrement: 当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数。Default: 3
  fatal-sql-exception : 它是一个逗号分割的信息片段.当一个 SQL 异常发生时,他的异常信息将 与这个信息片段进行比较.如果在片段中存在,那么这个异常将被认为是
   个致命错误(Fatal SQL Exception ).这种情况下,数据库连接将要被放弃.无论发生什么,这个异常将会被重掷以 提供给消费者.用户最好自己配置一个不同的异常来抛出.
  fatal-sql-exception-wrapper-class : 正如上面所说,你最好配置一个不同的异常来重掷.利用这 个 属 性 , 用 户 可 以 包 装 SQLException, 使 他 变 成 另 外 一 个 异 常 .
    这 个 异 常 或 者 继 承 SQLException 或 者 继 承 字 RuntimeException.proxool 自 带 了 2 个 实 现 :'org.logicalcobwebs.proxool
   .FatalSQLException' 和 'org.logicalcobweb s.proxool .FatalRuntimeException' .后者更合适.
  house-keeping-sleep-time : house keeper 保留线程处于睡眠状态的最长时间,house keeper 的 职责就是检查各个连接的状态,并判断是否需要销毁或者创建.
  house-keeping-test-sql : 如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试. 这个语句最好非常快的被执行.如果没有定义,测试过程将会被忽略。
  injectable-connection-interface : 允许 proxool 实现被代理的 connection 对象法.
  injectable-statement-interface : 允许 proxool实现被代理的 Statement 对象方法.
  injectable-prepared-statement-interface : 允许 proxool 实现被代理的 PreparedS tatement 对象 方法.
  injectable-callable-statement-interface : 允许 proxool 实现被代理的 CallableStat ement 对象方 法.
  jmx : 如 果属性 为 true,就会注册一个消 息 Bean 到 jms 服 务 ,消息 Bean 对象名 : "Proxool:type=Pool, name=<alias>". 默认值为 false.
  jmx-agent-id : 一 个 逗 号 分 隔 的 JMX 代 理 列 表 ( 如 使 用 MbeanServerFactory .fi ndMBeanServer(String agentId)注册的连接池。 )
   这个属性是仅当"jmx"属性设置为"true"才有 效。所有注册 jmx 服务器使用这个属性是不确定的 jndi-name : 数据源的名称 maximum-active-time :
   如果 housekeeper 检测到某个线程的活动时间大于这个数值.它将会 杀掉这个线程.所以确认一下你的服务器的带宽.然后定一个合适的值.默认是 5 分钟.
  maximum-connection-count : 最大的数据库连接数.
  maximum-connection-lifetime :一个线程的最大寿命.
  minimum-connection-count : 最小的数据库连接数
  overload-without-refusal-lifetime : 这可以帮助我们确定连接池的状态。如果我们已经拒绝了 一个连接在这个设定值(毫秒),然后被认为是超载。默认为 60 秒。
  prototype-count : 连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值.新的 连接将被建立(假设没有超过最大可用数).例如.我们有 3 个活动连接 2
   个可用连接,而我们的 prototype-count 是 4, 那 么 数 据 库 连 接 池 将 试 图 建 立 另 外 2 个 连 接 . 这 和 minimum-connection-count 不 同 .
   minimum-connect ion-count 把 活 动 的 连 接 也 计 算 在 内.prototype-count 是 spare connections 的数量.
     recently-started-threshold :这可以帮助我们确定连接池的状态,连接数少还是多或超载。 只要至 少有一个连接已开始在此值(毫秒)内,或者有一些多余的可用连接,那么我们假设连接池是开 启的。默认为 60 秒
  simultaneous-build-throttle :这是我们可一次建立的最大连接数。那就是新增的连接请求,但还 没有可供使用的连接。由于连接可以使用多线程,在有限的时间之间建立联系从而带来可用
   连接,但是我们需要通过一些方式确认一些线程并不是立即响应连接请求的,默认是 10。
  statistics : 连接池使用状况统计。 参数“10s,1m,1d”
  statistics-log-level :日志统计跟踪类型。 参数“ERROR”或 “INFO”
     test-before-use : 如果为 true,在每个连接被测试前都会服务这个连接,如果一个连接失败,那么将被丢弃,另一个连接将会被处理,如果所有连接都失败,
      一个新的连接将会被建立。 否则将会抛出一个 SQLException 异常。
     test-after-use : 如果为 true,在每个连接被测试后都会服务这个连接,使其回到连接池中,如 果连接失败,那么将被废弃。
     trace : 如果为 true,那么每个被执行的 SQL 语句将会在执行期被 log 记录(DEBUG LEVEL). 你也可以注册一个 ConnectionListener (参看 ProxoolFacade)得到这些信息
  
  4、BoneCP: 
  acquireIncrement: 当连接池中的连接耗尽的时候 c3p0 一次同时获取的连接数。Default: 3
  driveClass:数据库驱动
  jdbcUrl:响应驱动的 jdbcUrl
  username:数据库的用户名
  password:数据库的密码
  idleConnectionTestPeriod:检查数据库连接池中控线连接的间隔时间,单位是分,默认值:240, 如果要取消则设置为 0
  idleMaxAge:连接池中未使用的链接最大存活时间,单位是分,默认值:60,如果要永远存 活设置为 0
  maxConnectionsPerPartition:每个分区最大的连接数 minConnectionsPerPartition:每个分区最小的连接数
  partitionCount:分区数,默认值 2,最小 1,推荐 3-4,视应用而定
  acquireIncrement:每次去拿数据库连接的时候一次性要拿几个,默认值:2
  statementsCacheSize:缓存 prepared statements 的大小,默认值:0
  releaseHelperThreads:每个分区释放链接助理进程的数量, 默认值:3,除非你的一个数据库连接的时间内做了很多工作,不然过多的助理进程会影响你的性能
  <bean id="mainDataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
   <property name="driverClass" value="com.mysql.jdbc.Driver"/> 
   <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1/yourdb" />
   <property name="username" value="root"/>
   <property name="password" value="abcdefgh"/>
   <property name="idleConnectionTestPeriod" value="60"/>
   <property name="idleMaxAge" value="240"/>
   <property name="maxConnectionsPerPartition" value="30"/>
   <property name="minConnectionsPerPartition" value="10"/>
   <property name="partitionCount" value="3"/>
   <property name="acquireIncrement" value="5"/>
   <property name="statementsCacheSize" value="100"/>
   <property name="releaseHelperThreads" value="3"/>
  </bean>
  
  c3p0、dbcp、proxool、BoneCP 比较 、 、 、 1.1 测试环境 测试环境: 操作系统:windows xp sp3 数据库:mysql
  5.1 1.2 测试条件: 测试条件:
     initialSize=30;
     maxSize=200;
     minSize=30; 其余参数为默认值;
      1.3测试代码: 测试代码:利用 JAVA 代码模拟多线程对这三种数据库连接池进行测试,通过花费的时间判断效率
      DBTest.java:
      public class DBTest implements Runnable /*extends Thread*/ {
       public long date1=0;
    private static Proxool proxool;
    public static int count = 0;
    public static void main(String[] args) throws Exception {
     //DBCP.init();
     //C3P0.init();
     //proxool = Proxool.getInstance();
     BoneCPConn.init();
     DBTest test = new DBTest();
     test.startup();
    }
    public void startup() {
     for (int i = 0; i <5; i++) {
      Thread thread = new Thread(this);
      thread.start();
     }
    }
    public void run() {
     if(date1==0){
      date1 = System.currentTimeMillis();
         System.out.println(date1);
     }
     for(int i=0 ; i<10 ; i++){
     try {
       //Connection conn = DBCP.getConnection();
       // Connection conn = C3P0.getConnection();
       //Connection conn =proxool.getConnection();
      Connection conn = BoneCPConn.getConnection();
      if (conn != null) {
       Statement statement = conn.createStatement();
       ResultSet rs = statement.executeQuery("select * from user where id=1");
       while (rs.next()) {
        String username = rs.getString(2);
        System.out.println(username);
       }
       rs.close();
       statement.close();
       conn.close();
      }
     }catch (SQLException e){
      e.printStackTrace();
     }
    }
    count++;
    if(count==5){
     long date2 = System.currentTimeMillis();
     System.out.println(date2);
     System.out.println("运行完毕!耗时为:" + (date2 - date1) + "ms");
    }
   }
  }
  
  4.3.1 模拟 5 个线程循环 10 次并发访问数据库
    DBCP 用时 1181ms
       C3P0  用时 860ms
       Proxool 用时 1563ms
       BoneCP 用时 31ms
  4.3.2 模拟 10 个线程循环 10 次并发访问数据库
       DBCP 用时 1188ms
       C3P0 用时 953ms
       Proxool 用时 1625ms
       BoneCP 用时 63ms
  4.3.3 模拟 20个线程循环 10 次并发访问数据库
       DBCP 用时 1204ms
       C3P0 用时 1000ms
       Proxool 用时 1640ms
       BoneCP 用时 110ms
  4.3.4 模拟 30 个线程循环 10 次并发访问数据库
       DBCP 用时 1250ms
       C3P0 用时 1047ms
       Proxool 用时 1657ms
       BoneCP 用时 156ms
  4.3.5 模拟 50 个线程循环 10 次并发访问数据库
       DBCP 用时 1406ms
       C3P0 用时 1343ms
       Proxool 用时 1843ms
       BoneCP 用时 172ms
  4.3.6 模拟 100 个线程循环 10 次并发访问数据库
       DBCP 用时 1641ms
       C3P0 用时 2703ms
       Proxool 用时 2031ms
       BoneCP 用时 532ms
  4.3.7 模拟200 个线程循环 10 次并发访问数据库
       DBCP 用时 2093ms
       C3P0 用时 4891ms
       Proxool 用时 2406ms
       BoneCP 用时 936ms
  4.3.8 模拟 500 个线程循环 10 次并发访问数据库
       DBCP 用时 3219ms
       C3P0 用时 11703ms
       Proxool 用时 3343ms
       BoneCP 用时 1922ms
  4.3.9 模拟 800 个线程循环 10 次并发访问数据库
       DBCP 用时 4688ms
       C3P0 用时 12063ms
       Proxool 用时 4141ms
       BoneCP 用时 2859ms
  4.3.10 模拟 1000 个线程循环 10次并发访问数据库
       DBCP 用时 5187ms
       C3P0 用时 12563ms
       Proxool 用时 4703ms
       BoneCP 用时 3610ms
  4.3.11 模拟 3000 个线程循环 10 次并发访问数据库
       DBCP 用时 14094ms
       C3P0 用时 16297ms
       Proxool 用时 11344ms
       BoneCP 用时 11391ms
  4.3.12 模拟 5000 个线程循环 10 次并发访问数据库
       DBCP 用时 23610ms
       C3P0 用时 22032ms
       Proxool 用时 20125ms
       BoneCP 用时 17125ms
  4.4 测试结果分析: 测试结果分析:
       BoneCP 一直保持性能最佳
 -->

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值