8

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

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

有一个更好的方法吗?

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

4

3 回答 3

3

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

无论如何,您可以使用ResultSet.setFetchSize().

于 2013-08-22T14:40:51.847 回答
0

首先,文档说 SimpleJdbcDaoSupport 自 Spring 3.1 起已弃用- 最好使用JdbcDaoSupportNamedParameterJdbcDaoSupport

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

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

于 2013-08-22T14:41:12.213 回答
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;
}
于 2013-08-23T13:12:36.880 回答