получить значение следующей последовательности из базы данных с помощью спящего режима

У меня есть объект, у которого есть поле NON-ID, которое должно быть установлено из последовательности. В настоящее время я получаю первое значение последовательности, сохраняю его на стороне клиента и вычисляю из этого значения.

Однако я ищу «лучший» способ сделать это. Я реализовал способ получения следующего значения последовательности:

public Long getNextKey()
{
    Query query = session.createSQLQuery( "select nextval('mySequence')" );
    Long key = ((BigInteger) query.uniqueResult()).longValue();
    return key;
}

Однако этот способ значительно снижает производительность (создание ~ 5000 объектов замедляется в 3 раза - с 5740 мс до 13648 мс).

Я пробовал для добавления «фальшивой» сущности:

@Entity
@SequenceGenerator(name = "sequence", sequenceName = "mySequence")
public class SequenceFetcher
{
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequence")
    private long                      id;

    public long getId() {
        return id;
    }
}

Однако этот подход тоже не сработал (все возвращенные идентификаторы были равны 0).

Может ли кто-нибудь посоветовать мне, как получить следующее значение последовательности с помощью Hibernate эффективно?

Редактировать : Проведя расследование, я обнаружил, что вызов Query query = session.createSQLQuery ("select nextval ('mySequence')"); намного более неэффективен, чем использование @GeneratedValue - из-за Hibernate каким-то образом удается уменьшить количество выборок при доступе к последовательности, описанной @GeneratedValue .

Например, когда я создаю 70 000 объектов (то есть с 70 000 первичных ключей, полученных из одной и той же последовательности), я получаю все, что мне нужно.

ОДНАКО , Hibernate выдает только 1404 select nextval ('local_key_sequence') команд. ПРИМЕЧАНИЕ. На стороне базы данных для кеширования установлено значение 1.

Если я попытаюсь получить все данные вручную, мне потребуется 70 000 выборок, что приведет к огромной разнице в производительности. Кто-нибудь знает о внутреннем функционировании Hibernate и о том, как воспроизвести его вручную?

31
задан CDspace 5 April 2017 в 20:02
поделиться