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

Java 有没有办法在JdbcTemplate上智能地设置获取大小?,java,jdbctemplate,spring-jdbc,Java,Jdbctemplate,Spring Jdbc,我有一个按日期范围返回报告的查询。如果日期范围较大,则可能返回50k行。如果日期范围很小,则可以返回10条记录。我发现,当返回50k行时,将fetch size设置为1000可以大大加快执行时间。但是,当返回10行时,将其设置为1000会减慢速度并消耗过多内存。这只是一个例子,我有许多查询,它们根据各种条件(作业运行的类型等)返回几行或多行 理想情况下,如果可以在执行查询之后(但在返回行之前)自动设置,那就更好了 有更好的方法吗 我正在使用org.springframework.jdbc.cor

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

理想情况下,如果可以在执行查询之后(但在返回行之前)自动设置,那就更好了

有更好的方法吗

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

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


无论如何,您可以使用单独设置每个结果集的获取大小。

首先,文档说SimpleJDBCDAO支持是从Spring 3.1开始的-最好使用或

其次,在org.springframework.jdbc.core.support中 类JdbcDaoSupport有一个方法:您可以使用它来应用语句设置,例如获取大小和查询超时


另一个选项是限制查询结果集中返回的行数(例如,在MySQL使用中:LIMIT,对于PL\SQL使用“和rownum<50”)

我找到了一个解决方案。我发现可以在任何时候修改获取大小(即使在检索行时)。我的第一个实现将fetch大小默认为1。当我看到第二排时,我把它改成了10排。当我看到第11行时,我将其更改为100,以此类推。我使用本地和远程数据库运行了几个性能测试,并在下面的页面上着陆。(SpringJDBC使用行映射器。这就是我实现org.springframework.JDBC.RowMapper的方式)


另外,这个查询可以从服务器或客户机执行。当客户端处于远程时,适当地设置fetch大小会产生巨大的不同(由于跨线路的传输次数)。但是客户端的内存也很有限。。。。
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;
}