![0aea7bb53f643e2b6628e04b3960d0ce.png](https://i-blog.csdnimg.cn/blog_migrate/d8bd5dd0282ab69e3ba2e8df5a42105c.jpeg)
前言
当我们操作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 ..