




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
JDBC驱动深度优化引自支付宝周仓分享什么是绑定变量?
在Oracle中如果实现实现系统缓慢甚至停顿,完全可以不使用绑定变量轻松实现,比如想查询一下熊大的易极付帐号里有多少钱,可以用以下两种方式进行查询。select*fromacctrans_accountwhereaccount_no=‘熊大’;select*fromacctrans_accountwhereaccount_no
=:accno;Oracle绑定变量第一种情况下,DB每次都会该查询语句进行语法检查、语意分析、生存执行计划、计划优化,这里我们称之为硬解析。第二种情况下,DB只会进行一次编译,并将查询计划发放入共享池,以便后续可以重用这个查询计划,这里我们称之为软解析。在使用硬解析过程中oracle为了保证共享池中数据结构不被串改和脏读,会长时间的使用串行处理,那么硬解析的数量越多,DB的性能下降将越快。Oracle软硬解析访问数据库的两种方式A.createStatement() Statementstmt=conn.createStatement();
result=stmt.executeQuery(sql+"1");B.preparedStatement()
Stringv_sql='selectnamefromtable_awhereid=?'; stmt=conn.prepareStatement(v_sql);
stmt.setString(1,v_id);//为绑定变量赋值
stmt.executeQuery();相信各种各样的教科书都会告诉大家B方案才是最合适的,当然一般的理由都是sql注入的问题。天生支持绑定变量的JDBC前面提到的共享池是隶属与SGA的,将执行计划的定义信息缓存在了SGA中的共享池,其实Oracle可以做的还不止这一点,它将用于返回给应用的可执行对象游标将放入在PGA中进行缓存,在使用阶段,只需要填充参数,分配内存即可,不象在共享池中的缓存需要语法检查、语意分析、创建游标等动作。以下为PGA缓存配置参数。1.session_cached_cursors(LRU)服务端(ps.close会进入缓存,默认为20)2.hold_cursor=YESandRELEASE_CURSOR=NO(默认不启用)PGA与SGA缓存Implicitstatementcache是oraclejdbc驱动的一个缓存方案,它和很多对象池方案一样都选择了淘汰算法(LRU)。启用代码:OracleConnectionconn.setImplicitCachingEnabled(true);conn.setStatementCacheSize(10);OracleJDBC驱动PS缓存由于JDBC驱动并没有定义缓存PSAPI,所以多数时候数据源都会提供自己的语句缓存方案,例如:jboss提供的publicclassPreparedStatementCacheextendsLRUCachePolicy缓存实现,它同样使用LRU淘汰算法,然后,有一些数据源例如druid就提供了特定数据库的pscache支持,它oracle的配置如下<propertyname="poolPreparedStatements"value="true"/>
<propertyname="maxPoolPreparedStatementPerConnectionSize"value="20"/>数据源层的PS缓存创建一个PS对象是具有消耗的,即便各级都存在缓存,但应用至数据库之间的交付仍然会有一定的网络负担存在。在选择应用层缓存的时候,应当尽量选择jdbc驱动提供的缓存方案,因为Oracle更清楚JDBC中PreparedStatement的内部结构。因此,它可以管理该结构,以获得最佳性能。特别是它可以管理的buffer驱动程序的不同版本提供了不同的方式。缓存的注意事项每个preparedstatment对象提供两个buffer缓冲区,一个是byte[],另一个是char[],字符数组类型用于存放char,nchar,varchar2数据类型,字节数组则用于存放其他数据类型(BLOB、CLOB采用了其他方案,这里就不区纠结了),具体计算公式如下:rowSize和table中定义字段大小接近,还需附加column约两个字节,如:createtable(identitynumber(17),contentvarchar2(20));rowSize=17+2+20*2+2
java中char占用两个字节OracleJDBC驱动内存缓冲区当执行一条sql语句的时候,将获取一个可执行对象游标,将申请两个缓冲区,这块内存区中存放的数据行数将由这个值决定,Oracle默认该值为10,可以通过它对应的api为ps.setFetchSize(int),那么完整的内存计算公式为charsSize
=rowSize*fetchsizeFetchSize数据库 连接方式 PSCACHE fetchsize 字段长度 网络距离 总记录数 返回记录 执行时间(ms) ORACLE oci 支持 1 10000 15KM 300 0 1.5875 ORACLE oci 支持 50 10000 15KM 300 0 2.0468 ORACLE oci 支持 100 10000 15KM 300 0 2.6656 ORACLE oci 支持 1 10000 本地 300 0 0.1898 ORACLE oci 支持 50 10000 本地 300 0 0.3431 ORACLE oci 支持 100 10000 本地 300 0 1.2609 ORACLE thin 支持 1 10000 15KM 300 0 1.6344 ORACLE thin 支持 10 10000 15KM 300 0 1.6687 ORACLE thin 支持 100 10000 15KM 300 0
1.6266通过fetchsize提升性能不要忘了每个ps都会开辟一个内存区,由于存在pscache,也就是说连接池中的每个connection可能具备上百个ps,每个ps中的内存缓冲区大小是由表中字段大小决定的,例如:每条纪录定义:10k,fetchsize:50,pscache:100,连接池max值:30,
连接池个数:2极端情况下,内存占用会达到:2*10K*50*100*30*2=6GB不单如此由于占用内存过高,还可能引起频繁的fullgcFetchsize造成的OOM由于java语言本身要求对字节数组的填充必须使用0,在处理小的buffer状况没什么问题,如果分配一个大buffer那么填充过程将成为最大的性能瓶颈。Oracle驱动在每一次本版升级后都对内存缓冲区管理进行了调整,所以在选择pscache的时候应当尽量直接选择oracle本身提供的pscache方案。而通用的数据源语句cache在没有特殊处理的情况下是不可能相比的。Pscache的抉择Oracle10G驱动当一个PreparedStatement是第一次执行,必要的byte[]和char[]buffer会被分配。就是这样。buffer只有在PreparedStatement本身被释放(freed)的时候才会被释放(freed)。ImplicitStatementCache不会为管理buffer做任何事情。所有ImplicitStatementCache中缓存的PreparedStatements的持有着其分配的byte[]和char[]buffer准备立即被重用Pscache的抉择(2)Oracle10.2.0.4G驱动10.2.0.4.0驱动程序添加了一个连接属性着手解决出现在初始10g驱动程序的内存管理问题。此连接属性采用一种一刀切的方式。如果设置,返回一个PreparedStatement到ImplicitStatementCache中的时候会释放其中的buffer。Statement是从cache中取出时,buffer会被重新分配。这个简单的方法大大地减少了内存使用,但是牺牲了巨大的性能成本。如上所述,分配buffer是昂贵的。这个连接属性就是oracle.jdbc.freeMemoryOnEnterImplicitCache它的值是一个boolean字符串,“true”或“false”。如果设为“true”,当一个PreparedStatement返回cache时,buffer会被释放。如果设为“false”(默认值也是“false”),buffer被保留,和最初的10g驱动程序一样。该属性可以通过-D被设置为Systemproperty或作为调用getConnection方法时候的connectionproperty。请注意,设置freeMemoryOnEnterImplicitCache不会导致参数值buffer被释放,它只会影响该行数据buffer。Pscache的抉择(3)Oracle10.2.0.4G驱动此版本实现两个目标,最大限度地减少未内存使用量和最小化分配buffer的成本。驱动程序在每个连接内部创建了一个buffer缓存(buffercache)。当一个PreparedStatement返回到ImplicitStatementCache中的时候,它的buffer会被缓存到buffer缓存中。当一个PreparedStatement是从ImplicitStatementCache中取出时,buffer会也会同时从buffer缓存中取出。因此,ImplicitStatementCache中的PreparedStatement不再持有大的buffer,buffer会被多次重用而不是被多次创建。相比10g驱动程序,不管有没有freeMemoryOnEnterImplicitCache,都显著地提升了驱动程序的性能。Pscache的抉择(4)OCI&THIN指标10goci11gthin结论cpuUser3%-6%User2%-5%Usercpu会有较大下降。堆外内存2.55-2.88g2.15g省了几百块堆内内存300M+200M省了一百块服务响应时间538.28ms467.38ms这个比较明显,服务下降了70.9msDal层1.23ms0.98ms有点优势连接创建100ms(140)20ms(1000)瞬间爆发有优势TAF,MTS支持不支持ps.setQueryTImeout();防止查询阶段因为扫表引起的慢查询导致整个系统和DB处于阻塞状态。设置之后timeout线程检查超时并调用ps.cancel(),抛出sql
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一活动密室逃脱活动方案
- 六一活动竞拍活动方案
- 六一活动警营活动方案
- 六一活动遛娃活动方案
- 六一社区义诊活动方案
- 六一老会员活动方案
- 六一节目活动方案
- 六年级中队活动方案
- 药浴考试试题及答案
- 六盘水团建活动策划方案
- 《个人防护与职业健康》课件
- 大学生创业项目案例路演
- 苏教版四年级数学下册《多边形的内角和》市级公开课教案
- 安徽省蚌埠市2023-2024学年高一下学期7月期末考试 化学 含解析
- 高中物理选择性必修第二册全册考试高分突破必刷检测卷(基础版)
- 《陕西省分布的国家重点保护野生植物名录》
- 口腔拔牙手术知情同意书
- 【苏教版】2023-2024学年六年级科学上册期末模拟试卷2
- 民族团结先进个人事迹材料3篇汇集
- 2024版标前协议书-风力发电场工程3篇
- 2024年度版权买卖合同标的及交易金额规定3篇
评论
0/150
提交评论