我正在使用Spring Boot + CommonsDBCP + JdbcTemplate。我需要从具有大量数据的Hive表中获取记录。
SQL:select * from customer
总记录:52K。
我正在使用 List 来获取记录。对于上面提到的记录数,这运行缓慢。
这使用了 RowMapperResultSetExtractor ,该过程需要 96秒来提取数据。如果数据量增加,查询时间将增加。
是否有任何建议可以改善这段时间,或者在jdbctemplate中使用其他任何方法?
答案 0 :(得分:1)
您可以一次使用SELECT a, b, c, ...
使用try-with-resources进行普通的JDBC,也可以使用ResultSetMetaData给出column-label-to-column-no。 Map列表很昂贵,因此Objects列表会更好。 RowSet类很多。
最后但并非最不简单地 not 收集列表,但遍历所有对象将是理想的选择。
本地内存会使速度变慢的一个功能是使用Statement#setMaxRows
或setLargeMaxRows
来使用零件。
还有另一种选择:表转储。
无事务查询也可能会有所帮助。
这些都是值得商measures的措施;一个必须尝试。一个令人信服的改进,我可以重用从未发现的地方。首先从其他答案开始。
答案 1 :(得分:0)
如果您有一个可以映射到customers
表的类,则可以尝试编写一个自定义RowMapper
,将表中的条目映射到相关类的List
:
List<Customer> customers = jdbcTemplate.query("SELECT * FROM customers", getRowMapper());//where getRowMapper` is a method that returns a relevant RowMapper
另一种选择是:
List<Customer> customers = jdbcTemplate.queryForList("SELECT * FROM customers", Customer.class);
但是后一种解决方案也将使用RowMapperResultSetExtractor
,我相信仍然会缓慢处理结果。
我确实记得在Spring JDBC javadocs中某处使用自定义RowMapper
的 not 效率低下,因为进行映射的相关那个类需要将结果与相关的进行比较类以确保列与相关属性匹配,这需要花费时间。