Использую Primafaces DataTable c прокруткой pagination .Все сделал но вот беда грузит очень медленно ...С одной страницы на другую за 5 секунд даже болше хотя там всего 20 записей.Причина сего я незнаю буду рад за помощ
Вот мой Бин
@Named(value = "maximaBean")
@ViewScoped
public class MaximaBean implements Serializable{
private List<Maxima> maximes = null;
public List<Maxima> getMaximes() {
MaximaDAO maximaDAO=new MaximaDAO();
maximes=maximaDAO.getMaximes();
return maximes;
}
}
Мой DaoCLass
public class MaximaDAO {
private Session session = null;
private List<Maxima> maximes=null;
public List<Maxima> getMaximes() {
session=HibernateUtil.getSessionFactory()
.getCurrentSession();
Transaction tx = session.beginTransaction();
Query q = session.createQuery("From Maxima as maxima");
maximes=(List<Maxima>)q.list();
tx.commit();
tx=null;
return maximes;
}
}
и мой xhtml
<p:panel header="Example again" style="margin-bottom: 20px">
<h:form>
<p:dataTable value="#{maximaBean.maximes}" var="maxim" rows="5"
paginator="true"
paginatorTemplate="{CurrentPageReport} {FirstPageLink}
{PreviousPageLink} {PageLinks} {NextPageLink}
{LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="3,5,8">
<p:column headerText="Id">
<h:outputText value="#{maxim.id}"></h:outputText>
</p:column>
</p:dataTable>
</h:form>
</p:panel>
Уже со вчерашнего дня стараюсь ,главное в ютубе парнишка сделал у неего все ок а у меня не работает
Скорее всего, проблема не в JSF
, а в работе с базой данных. У вас при осуществлении выборки из таблицы не указывается ограничение на количество записей. В таком случае Hibernate
осуществляет вычитывание всех записей из таблицы, что может быть очень долгой операцией, если записей десятки/сотни тысяч.
Для корректной работы связки интерфейсной части с функциями БД следует разработать более сложные механизмы считывания данных, которые должны брать текущее состояние постраничности из dataTable
и использовать их в методах Query.setFirstResult
и Query.setMaxResults
.
Например, можно создать класс, расширяющий org.primefaces.model.LazyDataModel
и переопределяющий его метод
public List<T> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters).
Значение поля first
использовать для setFirstResult
, а поле pageSize
для setMaxResults
. Если сделать так, чтобы компонент MaximaBean
расширял LazyDataModel
, то в dataTable
он будет передаваться так:
p:dataTable value="#{maximaBean}"
PS Если осуществляется только выборка данных, без их модификации, то открывать и затем завершать транзакцию не обязательно, это лишняя трата ресурсов СУБД. И убедитесь в том, что полученные сессии возвращаются в пул или закрываются - не видно кода освобождения этого ресурса.
Посмотрите повнимательней на свой maximaBean, выдающий список maximes.
При каждом обращении к списку загрузка повторяется с нуля. А обращений, доложу я Вам, идёт просто немерянно. Практически на каждое поле.
При выводе таблицы приближенно вызывается такой код
for (int currentIndex = offset; currentIndex < pageSize; currentIndex++) {
...
maximaBean.getMaximes().get(currentIndex).getId();
...
}
Видно, что сколько раз выводится id , столько же раз загружается вся таблица.
И Вам ещё повезло, что новый список по составу не очень отличается от прежнего. Хотя с другой стороны ошибка была бы более очевидной.
Можете поставить breakpoint на getMaximes и понаблюдать, сколько раз он будет вызван при обработке страницы.
Поэтому грузить надо только один раз. Как-то так:
public List<Maxima> getMaximes() {
if (maximes == null) {
MaximaDAO maximaDAO = new MaximaDAO();
maximes = maximaDAO.getMaximes();
}
return maximes;
}
Не зря же заведено поле private List<Maxima> maximes
.
Для начала надо усвоить это. А далее в зависимости от размера таблицы двигаться в сторону LazyDataModel, как рекомендуется в другом ответе.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Посоветуйте хорошую библиотеку, которая умеет парсить HTML в формат PDF средствами PHP и понимает русскоязычные шрифтыПерепробовал кучу всего,...
Есть домен в openserverКак его переименовать, чтобы сайт после моих действий начал работать?
Мне нужно сверстать красивый dropdown который находится в форме, но стандартный select тяжело поддается стилизации, намного удобно через ul li сделатьКак...