Проблемы с производительностью при вызове базы данных в методе getter для dataTable, getter вызывается несколько раз - PullRequest
1 голос
/ 12 января 2011

Я новичок в JSF 2.0 и Primefaces, но решил создать свое приложение, используя их, увидев демонстрацию простых лиц.

Я заполнил заявку, но заметил, что она очень медленная. Я разместил файл system.out.println в разных местах, чтобы увидеть, что вызывается, и заметил, что иногда методы в моем контроллере, такие как методы, которые вызывают мой DAO для получения значений из базы данных, вызываются до 6 раз для одного события ! На моих страницах много таблиц данных, поэтому иногда несколько таблиц данных * 6 для каждого списка, заполняемого в каждой таблице, кажется, что именно это и вызывает медлительность.

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

public List<Addresses> getAddresses() {
     List<Addresses> addr = systemDao.getAddresses(userBean.userId);
     return addr;
}

в представлении, я буду вызывать этот метод как для элемента данных, чтобы отобразить результат.

Когда я впервые загружаю его, он будет вызывать его только один раз, но когда я нажимаю, может быть, кнопку, чтобы открыть диалог с полностью несвязанными данными, этот getAddresses () может вызываться 3-6 раз, и это не имеет ничего общего с Я прошу во время текущего действия. Кто-нибудь знаком с этим и как я могу ускорить работу моего приложения?

1 Ответ

5 голосов
/ 12 января 2011

Вы должны не поместить бизнес / логику базы данных в getter .Они предназначены только для возврата данных, а не для инициализации / загрузки / заполнения данных компонента.Вы должны выполнять бизнес / логику базы данных внутри @PostConstruct бина, метода действия или любых методов события, которые все вызываются только один раз, а не внутри геттера.

private List<Addresses> addr;

@PostConstruct
public void init() {
     addr = systemDao.getAddresses(userBean.userId);
}

public List<Addresses> getAddresses() {
     return addr;
}

Если вам действительно нужно сделать это в геттере по какой-то экзотической причине, тогда вам нужно ввести ленивую загрузку.

См. Также:

...