我无法将获取的记录添加到ArrayList
对象,因为ArrayList
的最大大小为Integer.max
,并且对mysql
数据库的查询正在检索太多记录的方式比Integer.max
。
我参加了spring boot
项目。我们需要一种使用mysql
从spring data jpa
数据库中获取记录的解决方案。下面是我获取记录的代码:
@Override
public List<HtsLogs> getAllRecords(String from, String to) {
System.out.println(from+" "+to);
List<HtsLogs> listHtsLogs = new ArrayList<HtsLogs>();
try {
String sql = "SELECT em.* FROM local_backup.hts_logs as em where em.created_date between ? and ? order by em.created_date desc ;";
Query query = entityManager.createNativeQuery(sql,HtsLogs.class);
query.setParameter(1, from);
query.setParameter(2, to);
listHtsLogs = query.getResultList();
}catch(Exception ex) {
System.out.println("exception HtsLOGS exception HtsLOGS exception HtsLOGS ");
ex.printStackTrace();
}
return listHtsLogs;
}
我希望一次在arraylist对象中累积所有记录,但是由于最大大小,我无法这样做。我收到java.lang.OutOfMemoryError: GC overhead limit exceeded
错误。有什么解决办法吗?
答案 0 :(得分:3)
将所有内容加载到内存中是导致OutOfMemoryError
而不是ArrayList最大大小限制的原因。
在这种情况下,Spring Data JPA提供了分页机制。这是一个示例:
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.CrudRepository;
import java.util.List;
public interface EmployeeRepository extends CrudRepository<Employee, Long> {
public List<Employee> findByDept(String deptName, Pageable pageable);
}
其中Pageable是用于分页信息的接口。
答案 1 :(得分:0)
如果增加Xmx不够或不可能,并且分页也不可行,则可以检查HtsLogs对象。通过为其字段选择不同的数据类型,它可能能够对其进行优化以提高内存效率。
请记住,对于该列表中的每个条目,该对象中任何次优的事物都会被相乘,并且如果您确实有许多条目,其大小如此重要,那么就很重要了。