有没有一种方法可以从mysql中获取超过ArrayList最大大小的记录

时间:2018-12-27 07:53:18

标签: java spring-data-jpa

我无法将获取的记录添加到ArrayList对象,因为ArrayList的最大大小为Integer.max,并且对mysql数据库的查询正在检索太多记录的方式比Integer.max

我参加了spring boot项目。我们需要一种使用mysqlspring 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错误。有什么解决办法吗?

2 个答案:

答案 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对象。通过为其字段选择不同的数据类型,它可能能够对其进行优化以提高内存效率。

请记住,对于该列表中的每个条目,该对象中任何次优的事物都会被相乘,并且如果您确实有许多条目,其大小如此重要,那么就很重要了。