读取数据库返回 ResultSet的时候,遍历数据用while (rs.next())数据量大的时候很慢。

发布时间 2023-03-29 16:58:58作者: lfm601508022

在做中台数据的时候,需要同步其他部位的系统的数据,目前同步数据要和其他部位的数据库对接,对方数据库为Oracle

在读取的过程中,数据量比较大,已经做了分页处理,分页大小为1000行。

但是同步1000条,发现居然要花4-5秒的时间,这有点说不过去。

经过半小时的排查,发现是while (rs.next())方式的遍历的问题,每隔10条就要47ms左右的时间再往下一个游标,看起来是java内存空间开辟的问题了。

然后去chatgpt了一下,给出的解释是这样的:

在Java中,当使用while(rs.next())来遍历ResultSet对象时,如果你的结果集非常大,那么每隔10条就会变得很慢。这是因为每当你调用rs.next()时,它都会从数据库中获取一行数据并将其转换为Java对象,这是一个相对较慢的操作。因此,如果你的结果集非常大,那么这个过程会变得非常耗时。

为了解决这个问题,你可以尝试使用setFetchSize()方法来设置每次从数据库中获取的行数。例如,你可以使用rs.setFetchSize(100)来一次性获取100行数据,这样可以减少与数据库的通信次数,从而提高性能。

另外,你还可以考虑使用分页来处理大型结果集。通过将结果集分成多个较小的块,你可以避免一次性获取所有数据而导致的性能问题。你可以使用LIMITOFFSET关键字来实现分页,或者使用ORM框架(如Hibernate)提供的分页功能。

看了豁然开朗,果然需要深入了解原理才行。

解决方案:

ResultSet对象的rs设置一下rs.setFetchSize(1000),1000这个参数是分页大小比较合适。

这样就可以享受速度带来的快感了。