簡體   English   中英

Java中的DAO類花費太多時間來獲取數據

[英]DAO Class in java taking too much time to fetch Data

我的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,但並沒有幫助。

因此,除非出現任何類型的連接問題,否則幾乎總歸結為您要獲取的記錄數。 如果您要獲取大量記錄,則該方法只有在遍歷每個項目並創建數組對象后才會返回。

我會嘗試在您的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);  
 }

只要確保您以正確的順序設置變量,它的性能就會更高。 我也喜歡這種相反的方法,因為它使我可以輕松適應不斷變化的模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM