java中的DAO类占用太多时间来获取数据

时间:2014-04-30 10:19:59

标签: java

我的DAO课程中有以下数据

public List<Environment> fetchMiddlewareVersions() throws SQLException{
      System.out.println("reached version");
      Environment environment;
      List<Environment> environments=new ArrayList<Environment>();
 try{
         connection=DBConnectionUtil.getConnection();
         statement=connection.createStatement();
         statement.setFetchSize(100);
         preparedStatement=connection.prepareStatement("select * from     middleware_version_details order by application,environment");
         resultSet=preparedStatement.executeQuery();
            while(resultSet.next())
            {
                environment = new Environment();
                environment.setAppName(resultSet.getString("APPLICATION"));
                environment.setHostName(resultSet.getString("HOSTNAME"));
                environment.setSoftwareComponent(resultSet.getString("SOFTWARE_COMPONENT"));
                environment.setVersion(resultSet.getString("VERSION"));
                environment.setInstallPath(resultSet.getString("INSTALL_PATH"));
                environment.setRemarks(resultSet.getString("REMARKS"));
                environment.setEnvironmental(resultSet.getString("ENVIRONMENT"));
                environments.add(environment);  

            }
    }

当我将整个数据放入JSP页面时,它已经消耗了20-30秒。如何提高获取速度。我试过DynaCache,但它没有帮助。

1 个答案:

答案 0 :(得分:0)

除非出现任何类型的连接问题,否则它几乎总是归结为您正在获取的记录数量。如果您正在获取A TON记录,则在完成每个项目并创建数组对象之前,该方法不会返回。

我会尝试在您的SQL语句中添加LIMITOFFSET子句,以便一次仅检索25个记录。 setFetchSize( int )不影响整体记录的数量,只影响底层传输一次从服务器获取的记录数。 (另外,将SQL查询移动到静态最终变量中:

 private static final String SQL_FETCH_MIDDLEWARE_VERSION = 
      "SELECT * FROM middleware_version_details order by application, environment " +
      "LIMIT = ? OFFSET = ?";

然后在准备好的语句中设置限制和偏移量,如下所示:

 preparedStatement.setInt( 1, <RECORD COUNT> );
 preparedStatement.setInt( 2, <RECORD START> );

第三,您在applicationenvironment上有索引吗?如果不这样做,并且您将不断订购,过滤和加入这些列,则应添加索引。

第四,它是一个小问题,但我坚持认为,做resultSet.getString( "<COLUMN NAME>" )会导致另一个调用查找列索引。这通常不是什么大不了的事,但如果你想尽可能地提高性能,你应该使用数字索引。您可以通过创建包含索引的私有静态变量来执行此操作:

 private static int INDEX_ENVIRONMENT = 6;

或者您可以使用计数器并确保列的顺序正确,如下所示:

while(resultSet.next())
{
     int iC = 0;

     environment = new Environment();
     environment.setAppName(resultSet.getString( iC++ ));
     environment.setHostName(resultSet.getString( iC++ ));
     environment.setSoftwareComponent(resultSet.getString( iC++ ));
     environment.setVersion(resultSet.getString( iC++ ));
     environment.setInstallPath(resultSet.getString( iC++ ));
     environment.setRemarks(resultSet.getString( iC++ ));
     environment.setEnvironmental(resultSet.getString( iC++ ));
     environments.add(environment);  
 }

确保您以正确的顺序设置变量,并且性能会略高一些。我也喜欢这种反制方法,因为它可以让我轻松适应不断变化的模式。