阿里巴巴Druid数据库连接池

监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息。

SQL执行的耗时区间分布。什么是耗时区间分布呢?比如说,某个SQL执行了1000次,其中0~1毫秒区间50次,1~10毫秒800次,10~100毫秒100次,100~1000毫秒30次,1~10秒15次,10秒以上5次。通过耗时区间分布,能够非常清楚知道SQL的执行耗时情况。

监控连接池的物理连接创建和销毁次数、逻辑连接的申请和关闭次数、非空等待次数、PSCache命中率等。

其次,方便扩展。Druid提供了Filter-Chain模式的扩展API,可以自己编写Filter拦截JDBC中的任何方法,可以在上面做任何事情,比如说性能监控、SQL审计、用户名密码加密、日志等等。

Druid内置提供了用于监控的StatFilter、日志输出的Log系列Filter、防御SQL注入攻击的WallFilter。

与主流连接池的性能比较场景一

单线程测试,连续执行100万次,对比时间、YungGC、FullGC的情况。这个场景用于测试非激烈竞争的情况下的性能差别。

测试结果

连续执行1000,000次,Druid和DBCP的测试对比结果:

连接池 时间(毫秒) YungGC FullGC

Druid22160

DBCP1,606700

BoneCP 762 4 0

场景二

多个线程,连续打开关闭连接1000,000次。

测试结果

连续执行1000,000次,Druid和DBCP的测试对比结果:

连接池 线程数量 时间(毫秒) YungGC FullGC

Druid21,177340

DBCP22,7381390

BoneCP22,24280

Druid53,7027800

DBCP539,2033500

Druid1011,1721620

DBCP1079,2207020

Druid2038,8173280

DBCP 20 159,966 1402 0

参考配置:

Xml代码

<beanid="dataSource"class="com.alibaba.druid.pool.DruidDataSource"init-method="init"destroy-method="close">

<propertyname="url"value="${jdbc_url}"/>

<propertyname="username"value="${jdbc_user}"/>

<property name="password" value="${jdbc_password}" />
&lt;property name="filters" value="stat" /&gt;
&lt;property name="maxActive" value="20" /&gt;  
    &lt;property name="initialSize" value="1" /&gt;  
    &lt;property name="maxWait" value="60000" /&gt;  
    &lt;property name="minIdle" value="1" /&gt;
&lt;property name="timeBetweenEvictionRunsMillis" value="60000" /&gt;  
    &lt;property name="minEvictableIdleTimeMillis" value="300000" /&gt;
&lt;property name="validationQuery" value="SELECT 'x'" /&gt;  
    &lt;property name="testWhileIdle" value="true" /&gt;  
    &lt;property name="testOnBorrow" value="false" /&gt;  
    &lt;property name="testOnReturn" value="false" /&gt;
&lt;property name="poolPreparedStatements" value="true" /&gt;  
    &lt;property name="maxPoolPreparedStatementPerConnectionSize" value="50" /&gt;  
&lt;/bean&gt;

相关推荐