Таблциа грузится очень медленно

265
26 февраля 2017, 07:58

Использую 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>

Уже со вчерашнего дня стараюсь ,главное в ютубе парнишка сделал у неего все ок а у меня не работает

Answer 1

Скорее всего, проблема не в 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 Если осуществляется только выборка данных, без их модификации, то открывать и затем завершать транзакцию не обязательно, это лишняя трата ресурсов СУБД. И убедитесь в том, что полученные сессии возвращаются в пул или закрываются - не видно кода освобождения этого ресурса.

Answer 2

Посмотрите повнимательней на свой 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, как рекомендуется в другом ответе.

READ ALSO
Подскажите как добавить в SearchView список?

Подскажите как добавить в SearchView список?

Подскажите как добавить в SearchView список?

306
Преобразование HTML в PDF с помощью PHP

Преобразование HTML в PDF с помощью PHP

Посоветуйте хорошую библиотеку, которая умеет парсить HTML в формат PDF средствами PHP и понимает русскоязычные шрифтыПерепробовал кучу всего,...

348
как переименовать домен в opensrver?

как переименовать домен в opensrver?

Есть домен в openserverКак его переименовать, чтобы сайт после моих действий начал работать?

288
Отправка данных из dropdown меню

Отправка данных из dropdown меню

Мне нужно сверстать красивый dropdown который находится в форме, но стандартный select тяжело поддается стилизации, намного удобно через ul li сделатьКак...

385