【发布时间】:2020-09-17 10:16:56
【问题描述】:
public List<Employee> getEmployeeDataByDate(Date dateCreated) throws Exception {
List<Employee> listDetails = new ArrayList<>();
sqlServTemplate.query(SyncQueryConstants.RETRIEVE_EMPLOYEE_RECORDS_BY_DATE, new Object[] { dateCreated },
new RowCallbackHandler() {
@Override
public void processRow(ResultSet rs) throws SQLException {
Employee emp = new Employee();
emp.setEmployeeID(rs.getString("employeeID"));
emp.setFirstName(rs.getString("firstName"));
emp.setLastName(rs.getString("lastName"));
emp.setMiddleName(rs.getString("middleName"));
emp.setNickName(rs.getString("nickName"));
byte[] res = rs.getBytes("employeeImage");
Blob blob = new SerialBlob(res);
emp.setEmployeeImage(blob);
// .....
listDetails.add(emp);
}
});
return listDetails;
}
这里我正在尝试检索员工表的记录。因为 BLOB 数据它说 OutOfMemoryError: Java heap space 。有人可以帮我吗?
这是一个独立的应用程序,我正在从一个表同步到另一个表。所以无法使用分页。每天 2k 记录将通过 cron 作业在午夜同步。给出一些想法,我可以如何解决这个问题。
SELECT * FROM Employees with(nolock) WHERE cast (datediff (day, 0, dateCreated) as datetime) >= ?
这个查询给了我所有基于日期的数据,(每天大约 2k 条记录)。 如果我在评论
byte[] res = rs.getBytes("employeeImage");
Blob blob = new SerialBlob(res);
emp.setEmployeeImage(blob);
这一行就没有问题了。否则会抛出错误。
请给出一些想法,如果可能的话,给出一些示例代码。 我在这个位置上挣扎了 2 天。
【问题讨论】:
-
问题是什么?太多数据无法放入可用堆空间。
-
增加你的堆,或者你可以简单地使用分页,每个查询得到 100 条记录
-
我有另一个有 40 万条记录的表,没有问题。(我也没有使用任何分页)只有在这个有问题的表中。
-
只有我发现的不同之处在于每条记录有 120 个字段,那里只有 50 个字段。
-
BLOB/CLOB 字段?我的猜测:兆字节大小的肖像照片。不使用所有字段进行测试。
标签: java spring spring-mvc spring-data-jpa jdbctemplate