如何实现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...

面试题 相关文章推荐
如何强制垃圾回收
Oct 06 面试题
大唐电信科技股份有限公司java工程师面试经历
Dec 09 面试题
SQL语言面试题
Aug 27 面试题
使用索引(Index)有哪些需要考虑的因素
Oct 19 面试题
应届生.NET方向面试题
May 23 面试题
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
Jul 27 面试题
铭立家具面试题
Dec 06 面试题
介绍一下linux文件系统分配策略
Nov 17 面试题
Linux上比较文件的命令都有哪些
Sep 28 面试题
介绍一下EJB的分类及其各自的功能及应用
Aug 23 面试题
String s = new String(“xyz”);创建了几个String Object?
Aug 05 面试题
Java基础类库面试题
Sep 04 面试题
开发中都用到了那些设计模式?用在什么场合?
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
9段PHP实用功能的代码推荐
2014/10/14 PHP
php判断用户是否手机访问代码
2015/06/08 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
JavaScript实现按Ctrl键打开新页面
2014/09/04 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
Python文件右键找不到IDLE打开项解决办法
2015/06/08 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Python简单操作sqlite3的方法示例
2017/03/22 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
python基本语法练习实例
2017/09/19 Python
Python语言描述最大连续子序列和
2017/12/05 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
Python实现微信小程序支付功能
2019/07/25 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
Pycharm+Python+PyQt5使用详解
2019/09/25 Python
关于解决iframe标签嵌套问题的解决方法
2020/03/04 HTML / CSS
印度网上药店:1mg
2017/10/13 全球购物
荷兰音乐会和音乐剧门票订购网站:Topticketshop
2019/08/27 全球购物
语文教育专业应届生求职信
2013/11/23 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
推广普通话的宣传语
2015/07/13 职场文书
思品教学工作总结
2015/08/10 职场文书
导游词之舟山普陀山
2019/11/06 职场文书
分析JVM源码之Thread.interrupt系统级别线程打断
2021/06/29 Java/Android
十大动画制作软件,Adobe产品上榜两款,第一是行业标准软件
2022/03/18 杂记
Mysql中mvcc各场景理解应用
2022/08/05 MySQL