public ArrayList getUserInfo() 

     long methodstart = System.currentTimeMillis(); 
      ArrayList<User> list = new ArrayList<User>(); 
      Connection conn = null; 
      ResultSet rs = null; 
      Statement stmt = null;
      User user= null; 
      String sql = "select * from t_user"; 
      try { 
          long constart = System.currentTimeMillis(); 
          conn = GetDbConnection.GetConnetion(); 
          long conend = System.currentTimeMillis(); 
          System.out.println("Connection time "+(conend-constart)+" ms"); 
          if (conn != null) { 
          rs = stmt.executeQuery(sql); 
          } 
          long resultstart = System.currentTimeMillis(); 
          while (rs.next()) { 
          user= new User(); 
          user.setUsername(rs.getString(1)); 
          user.setPassword(rs.getString(2)); 
          list.add(user); 
         } 
         stmt.close();
         long resultend = System.currentTimeMillis(); 
         System.out.println("getUserInfo ResultSet time "+(resultend-resultstart)+" ms"); 
         }catch (Exception ex) { 
         System.out.println(ex.toString()); 
        } finally { 
        try { 
         if (rs != null) { 
         rs.close(); 
          } 
         if (conn != null) { 
       conn.close(); 
        } 
      } catch (SQLException e) { 
      } 
    } 
long methodend = System.currentTimeMillis(); 
System.out.println("getUserInfo Time "+(methodend-methodstart)+" ms"); 
return list; 
} 以上是我简单的一个测试 
主要测试 
1.数据库连接时间 
2.数据库执行时间 
3.整个方法的时间(这种测试方法 我不能确定是否正确) 
测试结果(10次左右) (数据库是局域网) 
Connection time 360 ms (数据连接是用jdbc连接 用jndi测试过数据居然只要0ms,完全不明白为何差距如此大) 
getUserInfo ResultSet time 16 ms 
getUserInfo Time 4485 ms 
一共返回39条记录 
我这样测试了很多次 总觉的时间不合理 
我认为 连接时间+执行时间 <= 整个方法的时间 (关闭连接的时间没有测试) 
但 360+16 <4485 差距也太大了点 相减的4000ms到底在干什么?(主要不块不是很了解,希望有人帮我解答~!!!) 而且 一个数据操做 往往要调用另一个 数据操作 这将进行两次数据库连接 整个方法的时间更是大大的增长 
如果都写个一个数据操作的话代码也太庞大了 (这块又如何解决???) 我这样的测试是不是合理(我也怀疑),如果不合理 告之我合理的方法 
jdbc的性能关键在那里?如何才能提高? 
以上是我的一些疑问 望了解的人告之 

解决方案 »

  1.   

    大概我知道的数据库优化就是:
    1:首先做好数据库连接池.因为连接的建立很消耗时间而且每次都建立很浪费.还不易于处理资源释放之类的问题.
    2:会频繁使用的相同类似语句 使用预处理编译的preparestatement而不是statement对象.
      

  2.   

    另外,不要用select * 而是只查询你需要的列(特别是对视图的查询,因为*有可能做了多表连接查询)
    而且如果可能的话,还是用数据库的分页查询,比如MYSQL就是limit语句吧.ORACLE就是rownum之类的
      

  3.   

    long t0, t1, t2, t3;
    t0 = System.currentTimeMills();
    第一个功能时间
    t1 = System.currentTimeMills();
    t2 = System.currentTimeMills();
    第二个功能时间
    t3 = System.currentTimeMills();测试时不要在里面采用输出,打印输出是比较耗时的,等全部完成后再输出System.out.println(t1 - t0);
    System.out.println(t3 - t2);一般来说,数据库操作花在连接上的时间是很多的,连接池中的连接是拿来就可以用了,
    并不需要建立连接,所以时间消耗近乎是 0。