26 Mayıs 2023 Cuma

Reading Large Tables In Batches

1. SpringBoot Kullanıyorsak
PageRequest kullanılabilir
Örnek
Şöyle yaparız
PageRequest pageRequest = PageRequest.of(0,10);
Page<Account> page; List<Account> list; do { page = accountRepository.findAll(pageRequest); list = page.getContent(); page = page.next(); } while (!page.isEmpty());
2. JPA Kullanıyorsak
TypedQuery kullanılabilir
Örnek
Şöyle yaparız
int startPosition = 0;
int batchSize = 10;

while(true) {

  TypedQuery<Account> query = em.createQuery("SELECT a FROM Account a", Account.class);
  query.setFirstResult(startPosition);
  query.setMaxResults(batchSize_size);
  
   List<Account> list = query.resultList();
    if (list.size() == 0) {
      break;
    }
    startPosition += batchSize; 
}
3. SQL ile Offset + Limit
TypedQuery kullanılabilir
Örnek
Şöyle yaparız
Session session = em.unwrap(Session.class);
session.doReturningWork(new ReturningWork<>() {
    @Override
    public Integer execute(Connection connection) throws SQLException {
      int offsetPos = 0;
      
      PreparedStatement preparedStatement = connection
                .prepareStatement("SELECT * FROM ACCOUNTS LIMIT ? OFFSET ?");
      while (true) {
        preparedStatement.setInt (1, 10);
        preparedStatement.setInt (2, offsetPos);
        ResultSet resultSet = preparedStatement.executeQuery();
        if(!resultSet.next()) break; // break when finish reading
        do {
          System.out.println(resultSet.getString("user_id"));
        } while (resultSet.next());
        offsetPos += 10;
      }
    }
}
4. Statement.setFetchSize kullanılabilir
JDBC Statement Arayüzü yazısına bakınız


Hiç yorum yok:

Yorum Gönder