2015-06-03 30 views
0

我有一个数据库获取调用弹簧jdbcTemplate和行取得大约100万。迭代结果集需要花费太多时间。在调试行为后,我发现它像批处理一样处理一些行,然后等待一段时间,然后再次处理一批行并处理它们。看起来行处理不是连续的,所以总体时间进入分钟。我已经使用数据源的默认配置。请帮忙。春季JDBC模板ROW映射器太慢

[编辑]

下面是一些示例代码

this.prestoJdbcTempate.query(query, new RowMapper<SomeObject>() { 
      @Override 
      public SomeObject mapRow(final ResultSet rs, final int rowNum) throws SQLException { 

       System.out.println(rowNum); 
       SomeObject obj = new SomeObject(); 
       obj.setProp1(rs.getString(1)); 
       obj.setProp2(rs.getString(2)); 
       .... 
       obj.setProp8(rs.getString(8)); 
       return obj; 
      } 
    }); 
+3

这需要时间来在网络上移动一个百万行。您看到的“批处理”实际上是驱动程序通过网络向其自己的缓冲区请求更多行。由于网络开销,连续执行它是没有意义的。 无论如何映射一百万行的想法是什么?你是否同时需要内存中的所有对象?同时显示你的代码。 – Kayaman

+1

仅使用前向结果集。这对于获取这些数百万行很有用。还要将模式设置为只读。 –

+0

@Kayaman我需要在UI上显示结果,所以我需要同时在内存中的所有对象,也现在给出示例代码 –

回答

2

由于大部分的意见告诉你,一个mllion记录是无用的,不现实的显示在任何用户界面 - 如果这是一个真正的业务需求,你需要教育你的客户。

网络流量应用程序和数据库服务器是此类场景中性能的关键因素。有一个可选的参数,可以真正帮助您在这个场景:获取大小 - 这也一定程度上

例子:

Connection connection = //get your connection 
Statement statement = connection.createStatement(); 
statement.setFetchSize(1000); // configure the fetch size 

大部分的JDBC数据库驱动程序有一个低的获取大小默认和调整这可以帮助你在这种情况下。 **但要小心以下的**。

  • 确保您的JDBC驱动程序支持获取大小
  • 确保您的JVM堆设置(-Xmx)是足够宽处理,因为这样的结果创建的对象。
  • 最后,只选择需要减少网络开销的列。

在春天,JdbcTemplate让你设置fetchSize