【问题标题】:How to fetch data from table having millions of records using spring jdbc template如何使用spring jdbc模板从具有数百万条记录的表中获取数据
【发布时间】:2017-06-28 21:29:20
【问题描述】:

我正在尝试使用 spring jdbc 模板获取数据。 该表有数百万条记录。

使用下面的代码需要无限的时间,最后我停止运行代码。

private static final String CLIENTDATA_QUERY = "select logtime, clientip, clientagent, uri from client_data";
public List<ClientDataModel> readFromClientDataDB() {
//      jdbcTemplate.setFetchSize(1000);
        List<ClientDataModel> clientData = jdbcTemplate.query(CLIENTDATA_QUERY, new RowMapper<ClientDataModel>() {

            @Override
            public ClientDataModel mapRow(ResultSet rs, int rowNum) throws SQLException {
                ClientDataModel model = new ClientDataModel();
                model.setLogtime(rs.getString("logtime"));
                model.setClientIP(rs.getString("clientip"));
                model.setClientAgent(rs.getString("clientagent"));
//              model.setUri(rs.getString("uri"));
                return model;
            }
        });

        System.out.println("Client Data Size :" + clientData.size());
        return clientData;
    }

请有人建议我如何以最有效的方式从大表中检索记录。

需要获取所有记录,然后开始执行进一步逻辑的代码。这是在服务器端。

【问题讨论】:

  • 分页,分页,分页!使用光标等。
  • @FedericoPeraltaSchaffner 请您提出光标的意思。如果可能的话,你能否举个例子。谢谢
  • 不能逐页处理记录吗?为什么需要先将整个表读入内存?

标签: java mysql java-8 spring-jdbc jdbctemplate


【解决方案1】:

不要使用返回列表的方法,而是使用RowCallBackHandler. 您也可以在查询中使用分页。

JDBCTemplate 需要以对象的形式读取从数据库中检索到的所有数据,在保存大型结果集时会消耗大量内存。 Spring Batch 在这种情况下是更好的解决方案。

【讨论】:

  • 即使使用RowCallBackHandler 也会给我 java.lang.OutOfMemoryError: GC 开销限制超出
猜你喜欢
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
相关资源
最近更新 更多