Запрос Jsf datatable optimization count

#oracle #hibernate #jsf #jpa

#Oracle #переход в спящий режим #jsf #jpa

Вопрос:

У меня есть JSF datatable и отображение объекта, который содержит изображения, которые загружены лениво. Загружается после нажатия на строку для просмотра подробных сведений.

Но я должен отобразить imagecount в datatable. Datatable использует разбивку на страницы и отображает 15 строк на странице.

Я использую следующие аннотации для сопоставления

     // Fetch type must be lazy due to out of memory error in eager mode
@OneToMany(cascade = { CascadeType.REMOVE, CascadeType.MERGE }, mappedBy = "alarm", fetch = FetchType.LAZY, orphanRemoval = true)
@OrderBy("unixtime ASC")
@LazyCollection(LazyCollectionOption.EXTRA) // allows .size() and .contains() without initializing the whole collection
private volatile Set<AlarmImage> alarmImages = new HashSet<AlarmImage>();
  

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

  /**
 * @return the number of alarm images in this alarm
 */
public Integer getCountAlarmImages() {
    // wont initalize whole collection because LazyCollectionOption.EXTRA
    return this.alarmImages.size();
}
  

Это журнал гибернации

 [2016-10-07 08:51:13,095] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,190] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,282] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,375] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,466] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,559] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,651] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,744] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,836] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:13,930] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:14,022] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:14,117] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:14,210] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:14,302] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
[2016-10-07 08:51:14,395] [WebContainer : 1] DEBUG org.hibernate.SQL [] logStatement - select count(ID) from ALARM_IMAGE where ALARM_FK =?
  

Моя проблема в том, что для загрузки разбивки на страницы требуется в среднем 1,5 секунды. возможно ли это оптимизировать? Может быть, paralell загружает количество изображений на сигнал тревоги? Возможно ли это в jsf datatable?

Редактировать:

Версия гибернации: 4.2.17.Окончательная

Определение строки в файле xhtml

 <p:column>
    <h:outputText value="#{alarm.countAlarmImages}" />
</p:column>
  

Ответ №1:

Не думаю, что есть возможность «параллельной загрузки» их, возможно, что это уже делается в любом случае, но у меня есть несколько идей для вас:

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

 @Formula("(select count(1) from ALARM_IMAGE AI where AI.ALARM_FK = _this.ALARM_PK)") 
private Int alarmImageCount;
  

не могу точно вспомнить, на какой текущий объект ссылается ссылка, как в @Formula , проверьте sql, сгенерированный hibernate, и вы поймете это, но я думаю, что обычно это _this

2. Похоже, вы используете primefaces, вы можете сделать что-то вроде show the new page, но не указывать количество изображений (или указывать, что они загружаются), пока они не будут полностью загружены, а затем вводить их в ajax при их инициализации. Это определенно можно сделать, но займет некоторое время. Посмотрите на p:remoteCommand компонент и RequestContext объект, если вы идете по этому пути.

Комментарии:

1. Спасибо за ваш ответ. Я оцениваю это. Поскольку время загрузки не было требованием, специально определенным в моей задаче, я оставил его таким, как сейчас. Я приму ваш ответ, потому что асинхронный запрос был бы правильным решением