jdbc驱动深度优化.pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
jdbc驱动深度优化

JDBC驱动深度优化;什么是绑定变量? 在Oracle中如果实现实现系统缓慢甚至停顿,完全可以不使用绑定变量轻松实现,比如想查询一下熊大的易极付帐号里有多少钱,可以用以下两种方式进行查询。 select * from acctrans_account where account_no = ‘熊大’ ; select * from acctrans_account where account_no = :accno ; ;第一种情况下,DB每次都会该查询语句进行语法检查、语意分析、生存执行计划、计划优化,这里我们称之为硬解析。 第二种情况下,DB只会进行一次编译,并将查询计划发放入共享池,以便后续可以重用这个查询计划,这里我们称之为软解析。 在使用硬解析过程中oracle为了保证共享池中数据结构不被串改和脏读,会长时间的使用串行处理,那么硬解析的数量越多,DB的性能下降将越快。;访问数据库的两种方式 A. createStatement() Statement stmt = conn.createStatement(); result = stmt.executeQuery(sql+1); B. preparedStatement() String v_sql = select name from table_a where id = ? ; stmt = conn.prepareStatement(v_sql); stmt.setString(1, v_id ); //为绑定变量赋值 stmt.executeQuery(); 相信各种各样的教科书都会告诉大家B方案才是最合适的,当然一般的理由都是sql注入的问题。 ;前面提到的共享池是隶属与SGA的,将执行计划的定义信息缓存在了SGA中的共享池,其实Oracle可以做的还不止这一点,它将用于返回给应用的可执行对象游标将放入在PGA中进行缓存,在使用阶段,只需要填充参数,分配内存即可,不象在共享池中的缓存需要语法检查、语意分析、创建游标等动作。 以下为PGA缓存配置参数。 1.session_cached_cursors(LRU) 服务端 (ps.close会进入缓存,默认为20) 2.hold_cursor=YES and RELEASE_CURSOR=NO (默认不启用) ;Implicit statement cache是oracle jdbc驱动的一个缓存方案,它和很多对象池方案一样都选择了淘汰算法(LRU)。 启用代码: OracleConnection conn.setImplicitCachingEnabled(true); conn.setStatementCacheSize(10); ;由于JDBC驱动并没有定义缓存PS API,所以多数时候数据源都会提供自己的语句缓存方案,例如:jboss提供的public class PreparedStatementCache extends LRUCachePolicy缓存实现,它同样使用LRU淘汰算法,然后,有一些数据源例如druid就提供了特定数据库的pscache支持,它oracle的配置如下 property name=poolPreparedStatements value=true / ?property name=maxPoolPreparedStatementPerConnectionSize value=20 / ;创建一个PS对象是具有消耗的,即便各级都存在缓存,但应用至数据库之间的交付仍然会有一定的网络负担存在。 在选择应用层缓存的时候,应当尽量选择jdbc驱动提供的缓存方案,因为Oracle更清楚JDBC中PreparedStatement的内部结构。因此,它可以管理该结构,以获得最佳性能。特别是它可以管理的buffer驱动程序的不同版本提供了不同的方式。;每个preparedstatment对象提供两个buffer缓冲区,一个是byte[],另一个是char[],字符数组类型用于存放char,nchar,varchar2数据类型,字节数组则用于存放其他数据类型(BLOB、CLOB采用了其他方案,这里就不区纠结了),具体计算公式如下: rowSize和table中定义字段大小接近,还需附加column约两个字节,如: create table( identity number(17) , content varchar2(20) ); rowSize = 17+2+20*2+2 java中char占用两个字节;当执行一条sql语句的时候,将获取一个可执行对象游标,将申请两个缓冲区,这块内存区中存放的数据行数将由这个值决定,Oracle默认该值为10,可以通过 它

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档