我的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,但它没有帮助。
答案 0 :(得分:0)
除非出现任何类型的连接问题,否则它几乎总是归结为您正在获取的记录数量。如果您正在获取A TON记录,则在完成每个项目并创建数组对象之前,该方法不会返回。
我会尝试在您的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);
}
确保您以正确的顺序设置变量,并且性能会略高一些。我也喜欢这种反制方法,因为它可以让我轻松适应不断变化的模式。