`
agapple
  • 浏览: 1582918 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

dbcp继续优化篇(statement cache)

阅读更多


背景

   昨天有同事反映,原先用jboss jndi数据源,现在换成基于spring容器的dbcp配置后,发现原先的请求从5ms,增加到7ms,性能下降了50%。

 

分析

   在服务器上观察了一下请求的profile信息,发现一个请求90%多的时间都在mysql处理: 25%为prepared statement,70%为mysql read数据等待。

 

使用jvisualvm得到的一个time profile的结果:

 

 

发现很明显,preparestatement占了比较大的比例。

 

网上搜索了一把,找到一些相关内容,具体描述: (具体文档可查看附件)

 


   

 

   大致意思也就是说:一个数据库查询,主要可分为两个阶段,一个是prepared statement,另一个是真正的数据库execute。

 

   估算一下:

       statement cost :  7ms * 25% =  1.75ms , 基本符合请求响应时间的现象。

 

解决

   看一下,文档的基本描述: 

   

 

    dbcp的官方文档说明: http://commons.apache.org/dbcp/configuration.html

 

    有两个参数:

 

  • poolPreparedStatements : 表明是否开启statement cache,默认为false,也就是不开启
  • maxOpenPreparedStatements : statement cache的大小,默认为-1,也就是不限制

 

    因为以前使用的是jboss oracle-ds.xml配置,是有配置对应的cache。 

 

<prepared-statement-cache-size>10</prepared-statement-cache-size>

最后的配置: 

 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
.... 
	<property name="poolPreparedStatements" value="true" />
	<property name="maxOpenPreparedStatements" value="10" />
....
</bean>

 

几点说明:

 

  1. prepared statement cache是针对整个数据库连接池,是整个pool级别
  2. statement cache使用了common pools中的GenericKeyedObjectPool, 利用sql做为key。
  3. 单个connnection独享一个statement cache,也就是说maxOpenPreparedStatements是针对单个connection链接的,这里大家会有存在误用,须注意。
  4. GenericKeyedObjectPool使用的是Map<Object , List> , 单个key可以对应一个list资源列表,也就是说一个sql key可以有一组list statement。
最后加上了statement cache的profile 结果:


 
已经没有preparestatment的, 总体的响应时间也提升了25%在左右。

最后:

 

附上一下c3p0针对statement cache的配置描述:http://www.mchange.com/projects/c3p0/index.html#configuring_statement_pooling

简单的注意下,需要正确理解配置项的意义,不然会出现误用。

 

思考:

  1. statement cache是否适合于所有的应用?
    A: 针对业务复杂的应用,有大量的业务sql。使用cache是否会适得其反,cache命中率很低,反而增加了一个同步点
  2. 如何判断和设置statement cache的大小? 
    A: 通过btrace线上获取连接池的getMaxActive,这也是一种思路。
  • 大小: 36.3 KB
  • 大小: 35.4 KB
  • 大小: 42.3 KB
  • 大小: 58.4 KB
分享到:
评论
1 楼 lingqi1818 2011-02-16  
矛盾永远存在啊,哈哈

相关推荐

    dbcp优化配置说明

    dbcp优化配置说明,对DBCP进行了详细的讲解。希望对大家有所帮助。

    dbcp连接池优化

    dbcp连接池优化详解,主要是如何应对链接僵死的现象

    commons-dbcp2-2.9.0-bin.zip

    DBCP(DataBase Connection Pool)是 apache common上的一个 java 连接池项目,也是 tomcat 使用的连接池组件,依赖 于Jakarta commons-pool 对象池机制,DBCP可以直接的在应用程序中使用。 使用DBCP会用到commons-...

    dbcp jar包 dbcp jar 包

    dbcp jar包 一个是dbcp的包, 一个是pool包, 两者都导入工程

    开发工具 commons-dbcp2-2.1.1

    开发工具 commons-dbcp2-2.1.1开发工具 commons-dbcp2-2.1.1开发工具 commons-dbcp2-2.1.1开发工具 commons-dbcp2-2.1.1开发工具 commons-dbcp2-2.1.1开发工具 commons-dbcp2-2.1.1开发工具 commons-dbcp2-2.1.1开发...

    创建dbcp连接,dbcp(Spring)

    创建dbcp连接,dbcp(Spring)

    DBCP依赖Jar包

    DBCP的依赖Jar包,完整的,亲测能用,欢迎下载!DBCP的依赖Jar包,完整的,亲测能用,欢迎下载!

    DBCP连接池DBCP和C3P0配置

    DBCP连接池DBCP和C3P0配置,可以对数据源进行各种有效的控制

    commons-dbcp-1.2.2

    commons-dbcp-1.2.2 commons-dbcp-1.2.2 commons-dbcp-1.2.2

    dbcp所需要jar

    SpringMVC链接mysql数据库,配置需要用到的两个包class="org.apache.commons.dbcp.BasicDataSource

    commons中的DBCP连接池jar

    commons中的DBCP连接池jar,用于利用dbcp链接数据库

    commons-dbcp-1.4-API文档-中英对照版.zip

    赠送jar包:commons-dbcp-1.4.jar; 赠送原API文档:commons-dbcp-1.4-javadoc.jar; 赠送源代码:commons-dbcp-1.4-sources.jar; 赠送Maven依赖信息文件:commons-dbcp-1.4.pom; 包含翻译后的API文档:commons-...

    DBCP连接池原理分析

    DBCP连接池介绍 ----------------------------- 目前 DBCP 有两个版本分别是 1.3 和 1.4。 DBCP 1.3 版本需要运行于 JDK 1.4-1.5 ,支持 JDBC 3。 DBCP 1.4 版本需要运行于 JDK 1.6 ,支持 JDBC 4。 1.3和1.4基于...

    commons-dbcp.jar.rar

    commons-dbcp.jar dbcp数据库连接池驱动,包括pool、logging两个依赖

    DBCP数据库连接池包下载

    DBCP

    commons-dbcp-1.4

    commons-dbcp-1.4,到官网下载慢到抽筋,传这里来了。

    java dbcp连接池

    dbcp连接池

    开源数据库连接池dbcp

    开源数据库连接池dbcp及其文档

    commons-dbcp

    commons-dbcp-1.3-javadoc.jar, commons-dbcp-1.3-RC1.jar, commons-dbcp-1.3-sources.jar, commons-dbcp-1.3.jar, commons-dbcp-1.4-javadoc.jar, commons-dbcp-1.4-sources.jar, commons-dbcp-1.4.jar, commons-...

Global site tag (gtag.js) - Google Analytics