如何实现jdbc性能优化


Posted in 面试题 onJuly 30, 2012
jdbc程序的性能主要由两个因素决定,一是数据库本身的性质,另一个是与数据库相对独立的jdbc应用程序接口(api)的使用.这里说的是如何正确使用jdbc编程接口,以获得更好的性能.

jdbc主要优化有:

1.选择正确的jdbc驱动程序

2.Connention的优化 使用连接池来管理Connection对象

3.Statement的优化 使用批量更新等

4.Result的优化 正确的从数据库中get数据等

(1)选择正确的jdbc驱动程序:

1 jdbc-odbc 桥

2 本地api-部分 java驱动

3 jdbc网路协议-纯java驱动

4 jdbc本地协议

最好选择 jdbc网路协议-纯java驱动 效率比较高 但需要第三方软件的支持 比如corba weblogic属于这种类型

(2)优化Connection对象:

1.设置适当的参数 DriverManager.getConnection(String url,Properties props);

例如: Properties props=new Properties();

props.put(“user”,”wuwei”);

props.put(“password”,”wuwei”);

props.put(“defaultRowPrefectch”,”30″);

props.put(“dufaultBatchValue”,”5″);

Connection con=DriverManager.getConnection(“jdbc.net/forum/images/smiles/icon_surprised.gif border=0>racle:thin:@hostsString”,props);

对象可以通过设置setDefaultRowPrefetch(int) 和 setDefaultBatchValue(int) 两个参数类优化连接

2.使用连接池 可以自己写一个连接池 这样程序的灵活性强,便于移植.

apache项目开发了一套非常通用而表现非常稳定的对象池 http://jakarta.apache.org/commons/pool.htm

设计了自己的连接池后 在客户端调用建立对象

public Object makeObject() throws Exception{

Class.forName(“oracle.jdbc.driver.OracalDriver”);

return DriverManager.getConnection(“url”,”username”,”password”);

}

销毁对象时用

public void destroyObject(Object obj) throws Exception{

((Connection)obj.close());

}

注意几点 对象池里有没有回收机制,对象池里有机有容量限制,对象池里有多少个闲置对象(可以释放)

3.控制事务的提交 最好手动提交事务,不但可以可以保证数据原子性,而且对新能提高留下余地.

try{

connection.setAutoCommint(false);

// 代码 用PreparedStatement 性能比Statementh好.

connection.commit();

connection.setAutoCommit(true);

}

catch(SQLException e){

}

finally{

//代码

if(connection!=null){

connection.close();

}

}

4.适当的选择事务的隔离级别 TRANSACTION_READ_UNCOMMITED 性能最高

TRANSACTION_READ_COMMITED 快

TRANSACTION_REFEATABLE_READ 中等

RANSACTION_SERIALIZABLE 慢

(3)Statement 优化

jdbc3个接口用来处理sql的执行,是Statement PreparedStatement CallableStatement

提供适当的Statement接口

批量执行sql

从数据库批量获取数据

PreparedStatement 比Statement性能要好 主要体现在一个sql语句多次重复执行的情况

PreparedStatemnt只编译解析一次而Statement每次编译一次.

批量修改数据库

Statement 提供了方法addBatch(String)和executeBatch()

调用方法为stmt.addBatch(“isnert…..”); stmt.addBatch(“update…..”)

stmt.executeBatch();

也可以用PreparedStatement从而更好的提高性能.

pstmt=conn.preparedStatement(“insert into test_table(……) values(….?)”);

pstmt.setString(1,”aaa”);

pstmt.addBatch();

pstmt.setString(1,”bbb”);

pstmt.addBatch();

…..

pstmt.executeBatch();

批量地从数据库中取数据.

通过setFetchSize()和getFectchSize()方法来设定和查看这个参数.这个参数对体统的性能影响比较大.

这个参数太小会严重地降低程序地性能.

Connection Statement ResultSet都有这个参数,他们对性能地影响顺序是:

ResultSet———Statement———Connection

(4)优化ResultSet.

体现在以下几个方面

批量读取数据.合理设置ResultSet的getFetchSize()和setFetchSize()方法中的参数

使用正确的get和set方法

使用整数而不是字段名作为参数性能比较高,

例如 setInt(1,100);

setString(2,”aaaa”);

比 setInt(“id”,”100″);

setString(“name”,”aaaa”);

性能好

设置适当的滚动方向.有3个方向FETCH_FORWORD,FETCH_REVERSE FETCH_UNKNOWN

单向滚动性能比较高.

其他方面的性能优化

及时显示的关闭Connection Statement ResultSet

其中Connection可以用Connetion Pool处理.

使用数据库系统的强大查询功能去组织数据.这样程序运行是和数据库服务的交互次数少,数据库返回给

程序的记录条数少的多,所以性能有很大的提高.

Tags in this post...

面试题 相关文章推荐
请说出你所知道的线程同步的方法
Apr 19 面试题
线程的基本概念、线程的基本状态以及状态之间的关系
Oct 26 面试题
应用服务器有那些
Jan 19 面试题
数据库的约束含义
Sep 09 面试题
.net笔试题
Mar 03 面试题
了解AppleShare protocol(AppleShare协议)吗
Aug 28 面试题
如何判断计算机可能已经中马
Mar 22 面试题
EJB的激活机制
Oct 25 面试题
AJax面试题
Nov 25 面试题
一道输出判断型Java面试题
Oct 01 面试题
AssertionError 跟一下那个类是 “is – a”的关系
Feb 21 面试题
Unix如何在一行中运行多个命令
May 29 面试题
开发中都用到了那些设计模式?用在什么场合?
Aug 21 #面试题
Java的接口和C++的虚类的相同和不同处
Mar 27 #面试题
数据库连接池的工作原理
Sep 26 #面试题
说出一些常用的类,包,接口
Sep 22 #面试题
abstract class和interface有什么区别?
Jan 03 #面试题
Java面试题及答案
Sep 08 #面试题
List、Map、Set三个接口,存取元素时,各有什么特点?
Sep 27 #面试题
You might like
一个用php3编写的简单计数器
2006/10/09 PHP
PHP自动选择 连接本地还是远程数据库
2010/12/02 PHP
超级实用的7个PHP代码片段分享
2012/01/05 PHP
浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)(日常整理)
2015/10/26 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
php封装的page分页类完整实例代码
2020/02/01 PHP
IE和Mozilla的兼容性汇总event
2007/08/12 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
JQuery获取浏览器窗口内容部分高度的代码
2012/02/24 Javascript
类似天猫商品详情随浏览器移动的示例代码
2014/02/27 Javascript
JavaScript面向对象编程入门教程
2014/04/16 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
javascript无刷新评论实现方法
2015/05/13 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
jquery自适应布局的简单实例
2016/05/28 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
Python打包方法Pyinstaller的使用
2018/10/09 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
通过实例解析Python return运行原理
2020/03/04 Python
Python HTMLTestRunner测试报告view按钮失效解决方案
2020/05/25 Python
python 抓取知乎指定回答下视频的方法
2020/07/09 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
用缩写的指针比较"if(p)" 检查空指针是否可靠?如果空指针的内部表达不是0会怎么样?
2014/01/05 面试题
师范生实习自我鉴定
2013/11/01 职场文书
个人近期表现材料
2014/02/11 职场文书
英文自荐信常用句子
2014/03/26 职场文书
劳动仲裁调解书
2015/05/20 职场文书
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
python和anaconda的区别
2022/05/06 Python
OpenFeign实现远程调用
2022/08/14 Java/Android