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。

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

最后的配置: 

1.<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
2.....
3.    <property name="poolPreparedStatements" value="true" />
4.    <property name="maxOpenPreparedStatements" value="10" />
5.....
6.</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,这也是一种思路。
时间: 2024-09-22 11:46:30

dbcp继续优化篇(statement cache)的相关文章

Andrid listview异步图片加载之优化篇

Listview异步加载之优化篇 关于listview的异步加载,网上其实很多示例了,总体思想差不多,不过很多版本或是有bug,或是有性能问题有待优化.有鉴于此,本人在网上找了个相对理想的版本并在此基础上进行改造,下面就让在下阐述其原理以探索个中奥秘,与诸君共赏-          贴张效果图先:            异步加载图片基本思想: 1.      先从内存缓存中获取图片显示(内存缓冲) 2.      获取不到的话从SD卡里获取(SD卡缓冲) 3.      都获取不到的话从网络下载

2013年如何让网站上百度首页——站内优化篇

2012年8月23是一个让站长悼念的日子,因为这一天百度对搜索引擎调整,很多网站相继被K,已经将近4个月了,至今没有从还排名.今天是2012年12月12日,在本年度的最后一个月里,相信很多站长都在思考2013年如何让网站上百度首页,说实话,本人SEO中文网站长也在思考这个问题,经过几个月的实践经验,终于悟出来针对当前搜索引擎调整后如何优化网站,能使关键词排名百度首页,下面我给大家分享一下,供大家学校交流. 当前百度惩罚网站原因 在笔者看来,很多网站被惩罚的原因有3点:垃圾外链.友情链接质量.站内

企业网站优化经验浅谈SEO之站内优化篇

     当初的自己开始工作可算是顶级的seo菜鸟了,自己当初在学校,在网上学习的全是seo理论知识,要是说实践的话那是曾没有过的.对此我也很感谢我以前公司的培养和给予我的机会.初做seo,是给企业公司网站做seo搜素引擎优化. 那么我就针对我做过的企业网站seo,结合自己那么一丁点的经验来给大家浅谈一下网站内部优化. 首先,你拿到一个网站你得首先看他是否适合做seo,是否需要做改版,网站结构是否需要改动等等问题.一般来说DIV+CSS是比较适合做seo网站优化的.待你解决掉网站构架整体问题后,

关于weblogic中使用prepared statement cache后操作DDL的问题

前几天有客户问我这么个问题,他们在weblogic中配置了prepared statement cache, 而他们应用中有操作DDL的地方,比如alter table什么的,这时候如果使用cached prepared statement的话,Oracle端会抛出SQLException: 违反协议.其实这个问题,weblogic 文档中已经有描述,如下: http://e-docs.bea.com/wls/docs81/ConsoleHelp/jdbc_connection_pools.ht

网站优化排名之网站建设优化篇

网站优化排名之网站建设优化篇 一:域名和程序 空间的选择 医疗站点的域名一般是以病种名称的缩写加上当地的区号或者拼音开头,比如泉州妇科,qzfk这样的域名是最好的. 或者0596fk.程序用开源的系统来搭建,帝国cms,php教程cms.dedecms是民营医院常用的几种程序,因为这样程序本身对 seo教程的支持不错的,又比较知名 没有漏洞.空间用当地的空间速度快,如果当地没有,就用广东 北京 上海的,多线空间,电信 网通都要支持的全能空间. 二:网站布局和代码的优化 首先要设计好首页的版面,头

秋色园QBlog技术原理解析:性能优化篇:access的并发极限及超级分库分散并发方案(十六)

上节回顾:   上节 秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五) 中, 介绍了 秋色园QBlog 在性能优化方面,从技术的优化手段,开始步入数据库设计优化,并从数据的使用情况上进行了分析,从而将文章内容进行分离,得到新的分表,由于内容比较大,进而分了库,达到一种基础减压.   本节内容:   本节将介绍秋色园 QBlog 的Super分库方案,以及何以如此Super分库的原因.   描述说明:   在进行上了上节的分库方案后,虽然感觉一度秋色园QBlog的访

秋色园QBlog技术原理解析:性能优化篇:用户和文章计数器方案(十七)

上节概要:   上节 秋色园QBlog技术原理解析:性能优化篇:access的并发极限及分库分散并发方案(十六) 中, 介绍了 Access的并发上限,及从某种程度上 秋色园QBlog 针对并发上限进行了多个数据的划分,从而最大并发上限从64提升到64*N(个数据库),虽然总和的最大并发值是上升了,但是单个库的最大值并没有变化,或者说单个表的最大并发值没有发生变化,上限仍是64. 于是,对于频繁产生更新操作的访问计数器(用户表及文章表),是该进入优化的方案了.   本节概要:   本节将介绍秋色

秋色园QBlog技术原理解析:性能优化篇:数据库文章表分表及分库减压方案(十五)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三) --介绍如何实现无后缀URL 4: 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序 5: 秋色园QBlog技术原理解析:Module之页面基类设计(五) --介绍创建

秋色园QBlog技术原理解析:性能优化篇:打印页面SQL,全局的SQL语句优化(十三)

文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文件的作用 2: 秋色园QBlog技术原理解析:认识整站处理流程(二) --介绍秋色园业务处理流程 3: 秋色园QBlog技术原理解析:UrlRewrite之无后缀URL原理(三) --介绍如何实现无后缀URL 4: 秋色园QBlog技术原理解析:UrlRewrite之URL重定向体系(四) --介绍URL如何定位到处理程序 5: 秋色园QBlog技术原理解析:Module之页面基类设计(五) --介绍创建