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驱动 效率比较高 但需要第 3方软件Software支持 比如corba weblogic属于这种类型
(2)优化Connection对象:
1.设置适当参数 DriverManager.getConnection(String url,Properties props);
例如:
Properties props = 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.g order=0>racle:thin:@hostsString " ,props);
对象可以通过设置DefaultRowPrefetch() 和 DefaultBatchValue() 两个参数类优化连接
2.使用连接池 可以自己写个连接池 这样灵活性强,便于移植.
apache项目开发了套非常通用而表现非常稳定对象池 http://jakarta.apache.org/commons/pool.htm
设计了自己连接池后 在客户端建立对象
public Object makeObject throws Exception{
Class.forName( " oracle.jdbc.driver.OracalDriver " );
DriverManager.getConnection( " url " , " username " , " password " );
}
销毁对象时用
public void destroyObject(Object obj) throws Exception{
((Connection)obj.close);
}
注意几点 对象池里有没有回收机制,对象池里有机有容量限制,对象池里有多少个闲置对象(可以释放)
3.控制事务提交 最好手动提交事务,不但可以可以保证数据原子性,而且对新能提高留下余地.
try {
connection.AutoComm( false );
// 代码 用PreparedStatement 性能比Statementh好.
connection.commit;
connection.AutoCommit( true );
}
catch (SQLException e){
}
finally {
// 代码
(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 o test_table(......) values(....?) " );
pstmt.String( 1 , " aaa " );
pstmt.addBatch;
pstmt.String( 1 , " bbb " );
pstmt.addBatch;
.....
pstmt.executeBatch;
批量地从数据库中取数据.
通过FetchSize和getFectchSize思路方法来设定和查看这个参数.这个参数对体统性能影响比较大.
这个参数太小会严重地降低地性能.
Connection Statement ResultSet都有这个参数,他们对性能地影响顺序是:
ResultSet---------Statement---------Connection
(4)优化ResultSet.
体现在以下几个方面
批量读取数据.合理设置ResultSetgetFetchSize和FetchSize思路方法中参数
使用正确get和思路方法
使用整数而不是字段名作为参数性能比较高,
例如 Int(1,100);
String(2,"aaaa");
比 Int("id","100");
String("name","aaaa");
性能好
设置适当滚动方向.有3个方向FETCH_FORWORD,FETCH_REVERSE FETCH_UNKNOWN
单向滚动性能比较高.
其他方面性能优化
及时显示关闭Connection Statement ResultSet
其中Connection可以用Connetion Pool处理.
使用数据库系统强大查询功能去组织数据.这样运行是和数据库服务交互次数少,数据库返回给
记录条数少多,所以性能有很大提高.
最新评论