JSF - Список объектов в управляемом компоненте и вопрос управления памятью - PullRequest
1 голос
/ 07 февраля 2011

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

Приложение, которое я создаю, представляет собой простое приложение для хранения контактов, которое позволит вам создать новый контакт, сохранить информацию, такую ​​как адреса, номера телефонов, где они работают, и загрузить файлы, связанные с контактом.

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

Вся эта информация хранится в управляемом компоненте ContactManager.java . Все данные о контакте отображаются в таблицах данных. Таким образом, есть адрес с данными, телефон с данными, загружаемые данные. Каждое представление с датами находится на соответствующей вкладке. Я использую Primefaces для создания вкладок. Таким образом, в основном, когда контакт открыт, система должна загрузить около 10 списков данных, а также раскрывающиеся списки, используемые для выбора значений. заполнить эти таблицы данных во вкладках.

@ManagedBean
@ViewScoped
public class ContactManager implements Serializable {

     private Contact contactInfo;
     private List<Phone> phones;
     private List<Addresses> addresses;
     private List<Company> jobs;
     private List<Files> uploads;

     //dropdown select lists
     private List<Country> countryList;
     private List<State> stateList;

     //Getters and setters for everyting
     ..... (I am not going to type it all out but its there)


     @PostConstruct 
     public void openContact() {
         try {
             this.countryList = myDao.getCountryList();
             this.stateList = myDao.getStateList();
             this.addresses = myDao.getAddresses(contactInfo.contactId);
             this.phones = myDao.getPhones(contactInfo.contactId);
             this.jobs = myDao.getJobs(contactInfo.contactId);
             this.uploads = myDao.getUploads(contactInfo.contactId);
         }
     }  
}

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

Этот пример мал по сравнению с фактическим количеством списков и данных, которые я храню, но для упрощения меня интересует управление памятью.

Моя система будет использоваться несколькими пользователями, и загрузка всей этой информации беспокоит меня. Когда очищается память, выделенная для всего этого? Я несу ответственность за его очистку?

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

В настоящее время он отлично работает в моей системе, но я знаю, что все эти таблицы и списки хранятся в памяти до тех пор, пока пользователь не щелкнет и не откроет новый контакт или не закроет приложение.

Любое понимание того, является ли это правильным способом ведения дел или как обрабатывать такую ​​большую информацию, было бы замечательно.

Я использую JSF 2.0 / Primefaces 2.2RC2-Snapshot

1 Ответ

0 голосов
/ 07 марта 2011

Если таблицы большие, вам нужно много памяти на стороне сервера, с или без JSF.

Не используйте таблицы с обогащенными лицами; используйте пользовательский интерфейс: повторите и напишите для него пользовательский пейджинг.

таблицы простых лиц лучше, чем h: dataTable или rich: datatable.

JSF 2.0 использует на 50% меньше памяти для каждого пользователя.

Также используйте бобы @RequestScoped и ViewScoped; не используйте SessionScoped bean.

Вы также можете удалить сессионные компоненты из сеанса из контекста лиц.

context = FacesContext.getCurrentInstance();
externalContext = context.getExternalContext();  
externalContext.getSessionMap().remove("UserContext");
externalContext.getSessionMap().remove("SessionController");

Etc.

Кроме того, если у вас есть какой-то идентификатор для хранения на странице и вы думаете, что не можете использовать компоненты RequestScoped, это ошибка интегрировать с вашим приложением tomahawk myfaces и использовать t: saveState value = "# {bean.categoryId}" />

это идентификатор магазина или объекты, список карт, в текущей области страницы.

...