0aea7bb53f643e2b6628e04b3960d0ce.png

前言

当我们操作mysql的时候,如果数据量很小,那么我们如何处理都没有问题。但是当一张表非常大的时候,我们一个大查询,一个堆大插入,一个count(*),一个limit都是非常恐怖的,因此,我在下面说几种常用的优化方式。

当表数据非常多的时候,我们不能一次把查询结果load进内存中,那会以下就OOM的,需要采用流式读取,也就是Hibernate中的ScrollableResult的方式,它的底层实现就是jdbc的流式读取。

1. JDBC流式读取 (Hibernate ScrollableResult)

读取操作开始遇到的问题是当sql查询数据量比较大时候程序直接抛错,或是读不出来ResultSet的next方法阻塞。

Root Casue: mysql driver 默认的行为是需要把整个结果全部读取到内存(ResultSet)中,才允许读取结果。当遇到大数据的时候,这显然会导致OOM。这显然与期望的行为不一致,期望的行为是jdbc流的方式读取,当结果从mysql服务端返回后立即开始读取处理。这样应用就不需要大量内存来存储这个结果集。

正确的jdbc流式读取代码:

PreparedStatement ps = connection.prepareStatement("select .. from ..
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐