免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3492 | 回复: 4
打印 上一主题 下一主题

JDBC学习笔记-----jdbc性能优化[转载] [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-08-29 10:10 |只看该作者 |倒序浏览
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("jdbcracle:thinhostsString",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处理.
      使用数据库系统的强大查询功能去组织数据.这样程序运行是和数据库服务的交互次数少,数据库返回给
      程序的记录条数少的多,所以性能有很大的提高.


作者不清

论坛徽章:
0
2 [报告]
发表于 2003-08-29 11:56 |只看该作者

JDBC学习笔记-----jdbc性能优化[转载]

在服务器端能用SQLJ处理的商务逻辑最好不要放在客户端,否则客户端代码维护十分不便

论坛徽章:
0
3 [报告]
发表于 2003-08-29 20:47 |只看该作者

JDBC学习笔记-----jdbc性能优化[转载]

我有个应用是WEBLOGCI于PROGRESS连接的但是发现JDBC的接口效率不如原来用JDBC-ODBC的高,而且经常会断开。请大家帮助分析一
下。     


同一个网端,一般不会。

我遇到过这个情况:
如果客户端和数据库服务器在防火墙的两边,客户端使用连接池连接数据库
由于防火墙上维持的 tcp 连接有个时间限制,比如 一小时,一小时后
连接池里的 jdbc 连接其实已经断了,而客户端的系统并不知晓。

论坛徽章:
0
4 [报告]
发表于 2003-08-30 05:40 |只看该作者

JDBC学习笔记-----jdbc性能优化[转载]

To selen,

I got the same problem before.

Weblogic provides an option to set the "refresh period" value from the admin web interface. If you turn on this feature,  you should be possible to keep the connection.

论坛徽章:
0
5 [报告]
发表于 2003-09-06 21:58 |只看该作者

JDBC学习笔记-----jdbc性能优化[转载]

谢谢!我试试看!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP