druid数据库连接池

来源:互联网 发布:python 一段时间日期 编辑:程序博客网 时间:2024/05/17 18:04
druid数据库连接池

一.选用druid的理由:
1.支持在线监控数据源,包括session,sql执行次数,记录等 
2.效率高

二.配置

1.添加maven配置

         <dependency>            <groupId>com.alibaba</groupId>            <artifactId>druid</artifactId>            <version>1.0.26</version>         </dependency>


2. 注掉原有的DBCP数据源配置,加上以下配置

<bean id="myDataSource"class="com.alibaba.druid.pool.DruidDataSource"init-method="init" destroy-method="close">           <!-- 基本属性 url、user、password-->          <property name="url"value="${mysql_url}" />          <property name="username"value="${mysql_username}" />          <property name="password"value="${mysql_password}" />                      <!-- 配置初始化大小、最小、最大 -->          <property name="initialSize"value="100" />          <property name="minIdle"value="200" />           <property name="maxActive"value="2000" />                 <!-- 配置获取连接等待超时的时间 -->          <property name="maxWait"value="60000" />                 <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->          <propertyname="timeBetweenEvictionRunsMillis" value="60000"/>                 <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->          <propertyname="minEvictableIdleTimeMillis" value="300000" />                  <propertyname="validationQuery" value="SELECT 'x'" />          <propertyname="testWhileIdle" value="true" />         <property name="testOnBorrow"value="false" />          <property name="testOnReturn"value="false" />                <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->         <property name="poolPreparedStatements"value="true" />        <property name="maxPoolPreparedStatementPerConnectionSize"value="20" />                <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计 -->          <property name="filters"value="stat" />      </bean>


3.web.xml中添加以下内容

 

<!-- 添加支持 页面监控连接池 --><servlet><servlet-name>DruidStatView</servlet-name>       <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>    </servlet>    <servlet-mapping>       <servlet-name>DruidStatView</servlet-name>       <url-pattern>/druid/*</url-pattern>    </servlet-mapping>          <!-- druid 阿里连接池 -->    <filter>       <filter-name>DruidWebStatFilter</filter-name>       <filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>        <init-param>           <param-name>exclusions</param-name>            <param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>        </init-param>    </filter>    <filter-mapping>       <filter-name>DruidWebStatFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>


以上就配置好了,还是很简单的,然后打开监控页面

http://ip:port/项目名/druid/index.html


三.关于参数配置的解释:

1. 初始化时建立的物理连接个数,初始化发生在显示调用init方法,或者第一次getConnection时

<propertyname="initialSize" value="100" />


2. 最大连接池数量

<propertyname="maxActive" value="2000" />


3. 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

<propertyname="maxPoolPreparedStatementPerConnectionSize" value="20"/>


4. 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。5.5及以上版本有PSCache,建议开启。

<propertyname="poolPreparedStatements" value="true" />



四.个数据源之间的对比:

1.地址:

https://github.com/alibaba/druid/wiki/%E5%90%84%E7%A7%8D%E6%95%B0%E6%8D%AE%E5%BA%93%E8%BF%9E%E6%8E%A5%E6%B1%A0%E5%AF%B9%E6%AF%94



2.测试执行申请归还连接1,000,000(一百万)次总耗时性能对比。

Testcase
Connection conn = dataSource.getConnection();
conn.close();


测试demo地址:

https://github.com/alibaba/druid/blob/master/src/test/java/com/alibaba/druid/benckmark/pool/Case1.java


    private int               initialSize      = 10;
    private int               minPoolSize      = 10;
    private int               maxPoolSize      = 50;
    private int               maxActive        = 50;




结论:

1. Druid是性能最好的数据库连接池,tomcat-jdbc和druid性能接近。
2. proxool在激烈并发时会抛异常,完全不靠谱。
3. c3p0和proxool都相当慢,慢到影响sql执行效率的地步。
4. bonecp性能并不优越,采用LinkedTransferQueue并没有能够获得性能提升。
5. 除了bonecp,其他的在JDK 7上跑得比JDK 6上快
6. jboss-datasource虽然稳定,但是性能很糟糕





原创粉丝点击