有没有办法在JdbcTemplate上智能地设置提取大小?

时间:2013-08-22 14:34:21

标签: java jdbctemplate spring-jdbc

我有查询按日期范围返回报告。如果日期范围很大,则可能会返回50k行。如果日期范围非常小,则可以返回10条记录。我发现将fetch size设置为1000,当返回50k行时,会大大加快执行时间。但是当返回10行时将其设置为1000会减慢它并消耗过多的内存。这只是一个例子,我有很多查询根据各种条件(作业运行类型等)返回几行或多行。

理想情况下,如果在执行查询后(但在返回行之前)可以自动设置它会很好。

有更好的方法吗?

我正在使用org.springframework.jdbc.core.support.JdbcDaoSupport.SimpleJdbcDaoSupport getJdbcTemplate()的setFetchSize(1000);

3 个答案:

答案 0 :(得分:2)

这是默认的提取大小。显然没有最好的价值,因为你所描述的是在使用的内存和数据库往返之间的权衡(默认值100似乎对我来说足够好)。

无论如何,您可以使用ResultSet.setFetchSize()为每个结果集单独设置提取大小。

答案 1 :(得分:0)

首先,自从Spring 3.1以来,文档说SimpleJdbcDaoSupport为deprecated - 更好地使用JdbcDaoSupportNamedParameterJdbcDaoSupport

其次,在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;
}