Java+Oracle性能优化技巧指南(2)

以下内容为csdn的一位同仁针对Jdbc访问操作数据的性能测试结果。基本也说明各种操作的性能情况.

测试环境:P4 1.7 768M RAM windows 2000.

测试方法:

A,绑定变量以及允许事务的自动提交.

[code=java]
try {
      Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
      String url = “jdbc:oracle:thin:@localhost:1521:eshoredb”;
      String id=”11111″;
      String name=”lifeng”;
      String SQLstr=”insert into test(id,name)values(?,?)”;
      String user = “test”;
      String password = “password”;
      con = DriverManager.getConnection(url, user, password);
      PreparedStatement st=con.prepareStatement(SQLstr);
      long currentTime=System.currentTimeMillis();
      for(int i=0;i<=1000;i++){
       st.setString(1,id);
       st.setString(2,name);
       st.execute();
    }

    long endTime=System.currentTimeMillis();
    long time=endTime-currentTime;
    System.out.println(“time=”+time);
   
    }
    catch (Exception ex) {
      System.out.println(“print in consys_insert+servlet >>>>>>>>>>>>>” +
                         ex.toString());
    }
   finally
    {
          try {
            con.close();
          }
          catch (SQLException ex1) {
          }
    }
[/code]

测试运行消耗时间:3728 ms

B,非绑定变量以及允许事务自动提交

测试代码:

[code=java]
。。。
     String SQLstr=”insert into test(id,name)values(‘”+id+”‘,'”+name+”‘)”;
  。。。
    for(int i=0;i<=1000;i++){
        st.execute(SQLstr);
   }
 [/code]

测试消耗时间:3628 ms

 

C,绑定变量以及事务手动提交

测试代码:

[code=java]
try {
      Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance();
      String url = “jdbc:oracle:thin:@localhost:1521:eshoredb”;
      String id=”11111″;
      String name=”lifeng”;
      String SQLstr=”insert into test(id,name)values(?,?)”;
      String user = “test”;
      String password = “password”;
      con = DriverManager.getConnection(url, user, password);
      PreparedStatement st=con.prepareStatement(SQLstr);
       con.setAutoCommit(false);
      long currentTime=System.currentTimeMillis();
      for(int i=0;i<=1000;i++){
       st.setString(1,id);
       st.setString(2,name);
       st.execute();
    }
    con.commit();
    long endTime=System.currentTimeMillis();
    long time=endTime-currentTime;
    System.out.println(“time=”+time);
    con.setAutoCommit(true);
    }
    catch (Exception ex) {
      System.out.println(“print in consys_insert+servlet >>>>>>>>>>>>>” +
                         ex.toString());
    }
   finally
    {
          try {
            con.close();
          }
          catch (SQLException ex1) {
          }
    }
[/code]

 

测试消耗时间:1422ms

 

D,非绑定变量以及事务手动提交

测试消耗时间:1625 ms

 

再次 考虑使用批更新的方法(在事务自动提交的模式下)

1。绑定变量使用批更新 不支持!!

2、非绑定变量的方法进行批更新

[code=java]
Statement st=con.createStatement();
for(int i=0;i<=1000;i++){
    st.addBatch(SQLstr);
}
st.executeBatch();
[/code]

运行时间为:2640ms

 

再次 考虑使用存储过程的方法
[code=java]
CallableStatement st=con.prepareCall(“{ call test_proc(?,?) }”);
st.setString(1,id);
st.setString(2,name);
st.execute();
[/code]

存储过程的定义:
[code=sql]
create or replace procedure test_proc as v_id varchar2(32):=’11111111′;
v_name varchar2(32):=’lifeng’;
begin for num in 1..1000 loop
      insert into test (id,name) values(v_id,v_name);
end loop;
end test_proc;
[/code]

运行时间 : 297ms

测试结果发表于:http://pub.itpub.net/post/2879/12405