Java 8 + Hibernate - есть ли способ загружать объемные данные из БД параллельно? - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть приложение 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 в моем коде) должно как-то обновляться ..).

...