我有查询按日期范围返回报告。如果日期范围很大,则可能会返回50k行。如果日期范围非常小,则可以返回10条记录。我发现将fetch size设置为1000,当返回50k行时,会大大加快执行时间。但是当返回10行时将其设置为1000会减慢它并消耗过多的内存。这只是一个例子,我有很多查询根据各种条件(作业运行类型等)返回几行或多行。
理想情况下,如果在执行查询后(但在返回行之前)可以自动设置它会很好。
有更好的方法吗?
我正在使用org.springframework.jdbc.core.support.JdbcDaoSupport.SimpleJdbcDaoSupport getJdbcTemplate()的setFetchSize(1000);
答案 0 :(得分:2)
这是默认的提取大小。显然没有最好的价值,因为你所描述的是在使用的内存和数据库往返之间的权衡(默认值100似乎对我来说足够好)。
无论如何,您可以使用ResultSet.setFetchSize()
为每个结果集单独设置提取大小。
答案 1 :(得分:0)
首先,自从Spring 3.1以来,文档说SimpleJdbcDaoSupport为deprecated - 更好地使用JdbcDaoSupport或NamedParameterJdbcDaoSupport
其次,在org.springframework.jdbc.core.support中 类JdbcDaoSupport有一个方法:applyStatementSettings(Statement stmt),您可以使用它来应用语句设置,例如获取大小,max rows和查询超时。
另一种选择是限制查询结果集中返回的数字或行(在MySQL中使用:LIMIT,对于PL \ SQL使用“和rownum< 50” - 例如)
答案 2 :(得分:0)
我找到了解决方案。我发现可以在任何时候修改提取大小(即使在检索行时也是如此)。我的第一个实现默认将获取大小设置为1.当我看到第二行时,我将其更改为10.当我看到第11行时,我将其更改为100,等等。我使用本地和远程数据库运行了几次性能测试并着陆在下面。 (Spring JDBC使用行映射器。这就是我实现org.springframework.jdbc.RowMapper的方法。)
public T mapRow(ResultSet rs, int index) {
T dto = null;
if (index == 0) {
setFetchSize(rs, 50);
} else if (index == 50) {
setFetchSize(rs, 500);
} else if (index == 1000) {
setFetchSize(rs, 1000);
}
try {
dto = mapRowToDto(rs, index);
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
return dto;
}