[英]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語句中添加LIMIT
和OFFSET
子句,以一次僅檢索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> );
第三,您是否有關於application
和environment
的索引? 如果不這樣做,並且您將不斷對這些列進行排序,過濾和聯接,則應添加索引。
第四,這是一個次要的要點,但我要堅持的一點是,執行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.