阿里巴巴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
Druid 221 6 0
DBCP 1,606 70 0
BoneCP 762 4 0

场景二

多个线程,连续打开关闭连接1000,000次。
测试结果
连续执行1000,000次,Druid和DBCP的测试对比结果:

连接池 线程数量 时间(毫秒) YungGC FullGC
Druid 2 1,177 34 0
DBCP 2 2,738 139 0
BoneCP 2 2,242 8 0
Druid 5 3,7027 80 0
DBCP 5 39,203 350 0
Druid 10 11,172 162 0
DBCP 10 79,220 702 0
Druid 20 38,817 328 0
DBCP 20 159,966 1402 0

参考配置:

Xml代码
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<property name="url" value="${jdbc_url}" />
<property name="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;

猜你喜欢

转载自csc365kl.iteye.com/blog/1627286