#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. Спасибо за ваш ответ. Я оцениваю это. Поскольку время загрузки не было требованием, специально определенным в моей задаче, я оставил его таким, как сейчас. Я приму ваш ответ, потому что асинхронный запрос был бы правильным решением