- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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,可以通过
它
您可能关注的文档
最近下载
- 2025版《煤矿安全规程》宣贯培训课件.pptx VIP
- 2025年中国石油数智研究院秋季高校毕业生招聘60人笔试上岸历年真考点题库附带答案详解.doc
- 变电所改造工程施工方案(3篇).docx VIP
- 欧洲标准化委员化BS EN 10283 - 2010.pdf VIP
- 2025年中国石油数智研究院招聘笔试备考题库(带答案详解).pdf
- 期末模拟质量检测卷-2024-2025学年统编版语文三年级上册.docx VIP
- 山东省建筑施工企业安全生产管理人员安全生产知识考试题库(含答案).pdf VIP
- 城市规划设计计费(2004)中规协秘字第022号.pdf VIP
- 数据库原理及应用教程(MySQL版)全套教学课件.pptx VIP
- 关爱困境儿童让爱守护成长PPT模板.pptx VIP
文档评论(0)