`
agapple
  • 浏览: 1595544 次
  • 性别: 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(Database Connection Pool)是一种数据库连接池技术,主要用于管理数据库连接资源,提高应用程序访问数据库的效率和性能。通过预建立并维护一定数量的数据库连接,...

    dbcp连接池优化

    ### DBCP连接池优化详解 #### 一、引言 在现代软件开发中,数据库连接池技术的应用极为广泛,特别是在高并发环境下,它可以显著提高应用程序处理能力并降低数据库资源的消耗。Apache DBCP(Database Connection ...

    DBCP的使用优化数据库的连接

    这篇博客文章可能详细介绍了如何配置和优化DBCP以提升数据库连接的效率。 首先,了解DBCP的基本概念至关重要。DBCP的核心功能是维护一个连接池,池中的连接可以在多个请求之间共享,而不是每次请求都创建新的数据库...

    开源数据库连接池dbcp

    开源数据库连接池DBCP,全称为Jakarta-Commons-DBCP,是Apache软件基金会Jakarta项目中的一个组件,主要用于解决Java应用程序...在实际开发中,结合适当的文档学习和实践,可以更好地利用DBCP来优化数据库连接的管理。

    DBCP依赖Jar包

    DBCP(Database Connection Pool)是Apache软件基金会的一个开源项目,全称为"Commons DBCP",它提供了一个数据库连接池服务。数据库连接池在应用服务器启动时建立一定数量的数据库连接,然后在应用程序需要时分配给...

    commons-dbcp-1.4

    10. **版本升级**:尽管 1.4 是较旧的版本,但理解它的工作原理有助于了解后来的版本,如 DBCP 2.x,它引入了更多的改进和优化。 总的来说,Apache Commons DBCP 1.4 是一个成熟、可靠的数据库连接池解决方案,它...

    commons-dbcp源码

    - `org.apache.commons.dbcp.proxy`:包含用于创建代理连接和代理Statement的类,用于添加额外的监控和控制。 4. 主要类详解: - `BasicDataSource`:这是DBCP的数据源实现,它实现了DataSource接口,提供了配置...

    dbcp所需要jar

    6. **性能优化**:DBCP提供了一些高级配置选项,比如最大连接数(maxActive)、最小空闲连接数(minIdle)、最大等待时间(maxWait)等,可以根据实际应用的负载情况进行调整,以达到最佳的性能和资源利用率。...

    jdbc与dbcp数据库连接

    总的来说,JDBC是连接数据库的基础,而DBCP则是优化数据库访问的一种手段。结合使用JDBC和DBCP,开发者可以在Java应用中实现高效且易于管理的数据库连接。在实际开发中,理解并掌握这些技术对于构建健壮的数据库应用...

    commons-dbcp2-2.9.0-bin.zip

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

    dbcp连接池常用包

    总的来说,DBCP连接池是Java开发中一个重要的组件,理解和掌握其使用方法对于优化数据库操作、提高系统性能至关重要。这个压缩包提供了一个学习和实践DBCP的起点,开发者可以通过研究不同版本的特性,结合实际应用...

    commons-dbcp jar包

    通过合理地配置和使用DBCP,可以优化数据库操作性能,避免频繁的连接创建和销毁,提升应用的整体效率。在实际开发中,需要结合Spring的IoC容器来管理和使用DBCP,同时确保正确地配置和关闭数据库连接,以保持系统的...

    dbcp jar包 dbcp jar 包

    总的来说,DBCP是一个强大的数据库连接池实现,可以帮助Java开发者优化数据库操作,提高应用性能。正确配置和使用DBCP,能够有效地管理数据库连接,避免资源浪费,是企业级Java应用开发中不可或缺的工具。

    开发工具 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开发...

    commons-dbcp.jar.rar

    本篇文章将深入探讨DBCP的原理、使用方法及其在实际项目中的应用。 首先,让我们了解什么是数据库连接池。数据库连接池是在应用服务器启动时预创建一定数量的数据库连接,并将这些连接保存在一个池中。当应用程序...

    commons-dbcp-1.2.2

    6. **性能优化**:DBCP通过合理地管理和重用数据库连接,减少了数据库的开销,提高了整体系统性能。 在实际使用中,Apache Commons DBCP 1.2.2 可能需要与Apache Commons Pool库一起使用,因为DBCP依赖于Pool库来...

    commons-dbcp-1.4.jar依赖包

    5. **性能优化**:讨论DBCP的性能调优策略,如设置合适的连接池大小、启用连接验证和空闲检查频率等。 6. **与其他连接池的比较**:简述DBCP与C3P0、HikariCP、Druid等其他流行的Java数据库连接池的差异和选择依据...

    创建dbcp连接,dbcp(Spring)

    DBCP(Database Connection Pool)是Apache Commons项目中的一个数据库连接池组件,...总之,DBCP是Spring中常用的一种数据库连接池实现,通过配置和自定义代码,可以有效地管理和优化数据库连接,提高系统的运行效率。

    commons中的DBCP连接池jar

    Apache Commons DBCP(Database Connection Pool)是Java开发中常用的一个数据库连接池组件,它属于Apache Commons项目的一部分。DBCP提供了数据库连接池的功能,能够有效地管理和复用数据库连接,提高应用性能并...

Global site tag (gtag.js) - Google Analytics