Druid连接池三(学习笔记)

本文详细介绍了Druid连接池在处理Oracle数据库时的PreparedStatementCache优化,包括内存占用问题、解决方案以及对比其他数据库连接池的特性。Druid通过特定的优化策略解决了Oracle的内存占用问题,如使用Oracle提供的接口清理缓冲,并根据查询结果动态调整RowPrefetchSize。此外,还介绍了Druid与其他连接池如DBCP的对比,以及如何平滑迁移和配置Druid。
摘要由CSDN通过智能技术生成

11. Druid缓存

连接Oracle数据库,打开PSCache,在其他的数据库连接池都会存在内存占用过多的问题,Druid是唯一解决这个问题的连接池。

Oracle数据库下PreparedStatementCache内存问题解决方案

    Oracle支持游标,一个PreparedStatement对应服务器一个游标,如果PreparedStatement被缓存起来重复执行,PreparedStatement没有被关闭,服务器端的游标就不会被关闭,性能提高非常显著。在类似SELECT * FROM T WHERE ID = ?这样的场景,性能可能是一个数量级的提升。

由于PreparedStatementCache性能提升明显,DruidDataSourceDBCPJBossDataSourceWeblogicDataSource都实现了PreparedStatementCache

PreparedStatementCache带来的问题

    阿里巴巴在使用jboss连接池做PreparedStatementCache时,遇到了full gc频繁的问题。通过mat来分析jmap dump的结果,发现T4CPreparedStatement占内存很多,出问题的几个项目,有的300M,有的500M,最夸张的900M。这些应用都是用jboss连接池访问Oracle数据库,T4CPreparedStatementOracle JDBC DriverPreparedStatement一种实现。 oracle driver不是开源,通过逆向工程以及mat分析,发现其中占内存的是字段char[] defineCharsdefineChars大小的计算公式是这样的:

    defineChars大小 = rowSize * rowPrefetchCount

    rowPrefetchCountOracle中,缺省值为10

    其中rowSize是执行查询设计的每一列的大小的和。计算公式是:

    rowSize = col_1_size + col_2_size + ... + col_n_size

    很悲剧,有些列数据类型是varchar2(4000),于是rowSize巨大,很多个表关联的SQLrowSize可能高达数十K,再乘以rowPrefetchCountdefineChars大小接近1M。可以想想,maxPoolSize设置为30PreparedStatementCacheSize设置为50的场景下,是可能导致PreparedStatementCache占据上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值