У меня есть приложение Java8 / Hibernate, которое делает несколько простых выборок из БД PostgreSQL.Выборка основана на индексированном столбце, поэтому обычно она достаточно быстрая:
List<ReviewsDbRecord> result = null;
Session session = null;
try
{
session = startSession();
String hql = "select reviewsDbRecord from ReviewsDbRecord reviewsDbRecord where reviewsDbRecord.productId = " + productId;
Query select = session.createQuery( hql ).setMaxResults( Integer.MAX_VALUE );
result = select.list();
}
catch ( Exception e )
{
logger.error( "getProductReviews failed", e );
}
Однако, для некоторых продуктов существует множество обзоров, поэтому мы собираем в больших количествах:
int start = 0;
int bulk = 100;
List<ReviewsDbRecord> reviews = new ArrayList<>();
List<ReviewsDbRecord> bulkReviews = null;
do
{
bulkReviews = dao.getProductReviewsPaginated( productId, start, bulk );
reviews.addAll( bulkReviews );
if( !bulkReviews.isEmpty() )
start = bulkReviews.get( bulkReviews.size() - 1 ).getId() + 1;
}while( !bulkReviews.isEmpty() );
И соответствующий метод DAO:
public List<ReviewsDbRecord> getProductReviewsPaginated( int productId, int start, int bulk )
{
List<ReviewsDbRecord> result = null;
Session session = null;
try
{
session = startSession();
String hql = "select reviewsDbRecord from ReviewsDbRecord reviewsDbRecord where reviewsDbRecord.productId = " + productId + " and reviewsDbRecord.id >= " + start + " order by reviewsDbRecord.id";
Query select = session.createQuery( hql ).setMaxResults( bulk );
result = select.list();
}
catch ( Exception e )
{
logger.error( "getProductReviewsPaginated failed", e );
}
finally
{
closeSession( false );
}
return result;
}
У меня такой вопрос - есть ли способ получить объемные данные параллельно?Я пытался выяснить это с помощью CompletableFuture.supplyAsync()
, но не смог заставить его работать (так как смещение (start
в моем коде) должно как-то обновляться ..).