OutOfMemoryError:Java堆空间,使用Jdbctemplate检索数据时:(RowCallbackHandlerResultSetTextRactor.extractData)

OutOfMemoryError:Java堆空间,使用Jdbctemplate检索数据时:(RowCallbackHandlerResultSetTextRactor.extractData),java,spring,spring-mvc,spring-data-jpa,jdbctemplate,Java,Spring,Spring Mvc,Spring Data Jpa,Jdbctemplate,这个查询提供了基于日期的所有数据(每天大约2k条记录)。 如果我在评论 SELECT * FROM Employees with(nolock) WHERE cast (datediff (day, 0, dateCreated) as datetime) >= ? 这条线就没有问题了。另一方面,这是投掷错误 请给出一些想法,如果可能,请给出一些示例代码。 我在这个位置上挣扎了2天。正如其他一些评论员所提到的,您可以增加堆空间或限制查询返回的记录数量,并以较小的批处理这些记录。正如其他评

这个查询提供了基于日期的所有数据(每天大约2k条记录)。 如果我在评论

SELECT * FROM Employees with(nolock) WHERE cast (datediff (day, 0, dateCreated) as datetime) >= ?
这条线就没有问题了。另一方面,这是投掷错误

请给出一些想法,如果可能,请给出一些示例代码。
我在这个位置上挣扎了2天。

正如其他一些评论员所提到的,您可以增加堆空间或限制查询返回的记录数量,并以较小的批处理这些记录。

正如其他评论员所提到的,您可以增加堆空间或限制记录数量您正在从查询返回并以较小的批处理它们。

您正在读取MB大小的图像(以字节为单位),它将消耗您的堆内存。。 请尝试使用BinaryStream:

byte[] res = rs.getBytes("employeeImage");
                        Blob blob = new SerialBlob(res);
                        emp.setEmployeeImage(blob);

您正在读取MB大小的图像(以字节为单位),它将消耗您的堆内存。。 请尝试使用BinaryStream:

byte[] res = rs.getBytes("employeeImage");
                        Blob blob = new SerialBlob(res);
                        emp.setEmployeeImage(blob);

您可以一次处理一个用户,而不是将每个用户添加到列表中。当从源数据库中提取每条记录时,将其放在另一个数据库中,而不是将它们添加到导致OOM错误的列表中。如果下游还有其他处理,则将一个类注入到这个DAO中,该类处理对目标数据库的实际处理/写入。

而不是将每个用户添加到列表中,您可以一次处理一个用户。当从源数据库中提取每条记录时,将其放在另一个数据库中,而不是将它们添加到导致OOM错误的列表中。如果下游还有其他处理,那么将一个类注入到这个DAO中,该类处理对目标数据库的实际处理/写入。

问题是什么?太多的数据无法放入可用的堆空间。增加堆,或者您可以简单地使用分页,每个查询获得100条记录。如果有另一个表有410万条记录,则没有问题。(我也没有使用任何分页)只有在这个表中有问题。我发现的唯一区别是每个记录有120个字段,这里只有50个字段。BLOB/CLOB字段?我猜:兆字节大小的肖像照片。通过不使用所有字段进行测试。问题是什么?太多的数据无法放入可用的堆空间。增加堆,或者您可以简单地使用分页,每个查询获得100条记录。如果有另一个表有410万条记录,则没有问题。(我也没有使用任何分页)只有在这个表中有问题。我发现的唯一区别是每个记录有120个字段,这里只有50个字段。BLOB/CLOB字段?我猜:兆字节大小的肖像照片。通过不使用所有字段进行测试。
InputStream image = rs.getBinaryStream("employeeImage");