2013-12-06 4 views
1

Я использую Jboss. У меня есть набор флажков, которые я создал через производителя (@Named, @SessionScoped), данные поступают из базы данных mysql (с использованием гибернации). Когда я нажимаю флажок, я печатаю (p:growl) сообщение (с p:ajax) в соответствии с установленным флажком. Все это работает. Но каждый раз, когда я нажимаю checkbock, я вижу, что спящий режим выполняет МНОГИЕ ненужные запросы. На самом деле не должно быть SINGLE-запроса, выполняемого при нажатии флажка, поскольку метод, который я вызываю, принимает только profile в качестве аргумента и отправляет сообщение из его поля.checkbox click выполняет многие запросы на спящий режим

Вот соответствующий код:

для JSF-часть:

<p:growl id="checkMessages" /> 
    <p:dataTable var="_profile" value="#{profileProducer.getProfilesByFormAndName('test','test')}" > 
     <p:column> 
      <p:selectBooleanCheckbox value="#{orderController.checkedProfiles[_profile]}"> 
       <p:ajax update="@([id$=checkMessages])" listener="#{profileProducer.profileCheck(_profile)}" /> 
      </p:selectBooleanCheckbox> 
     </p:column> 
    </p:dataTable> 

профиль контроллера:

@Named 
@SessionScoped 
public class ProfileController implements Serializable { 

    private List<Profile> temporaryCheckedProfileList = new ArrayList<Profile>(); 

    public void profileCheck(Profile profile) { 
     System.out.println(profile); 
     String message = profile.getMessage(); 
     if (message == null || message.equals("")) 
      return; 
     if (!temporaryCheckedProfileList.contains(profile)) { 
      FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(message)); 
      temporaryCheckedProfileList.add(profile); 
     } else { 
      temporaryCheckedProfileList.remove(profile); 
     } 
    } 
} 

profileProducer:

@RequestScoped 
@Named 
public class ProfileProducer { 

    @Inject 
    private ProfileRepository profileRepository; 
    @Inject 
    private GroupRepository groupRepository; 

    public List<Profile> getProfilesByFormAndName(@New String formName,@New String groupName) { 
     return profileRepository.getProfilesByGroup(groupRepository.getGroupByFormAndName(formName, groupName)); 
    } 
} 

Они являются дие Риз, которые выполняются при открытии веб-сайт в первый раз (это правильное & ожидаемое поведение):

Hibernate: select * from group group0_ inner join form form1_ on group0_.form_id=form1_.id where group0_.name=? and form1_.name=? limit ? 

Hibernate: select * from profile profile0_ inner join group_profile groupprofi1_ on profile0_.id=groupprofi1_.profile_id inner join group group2_ on groupprofi1_.group_id=group2_.id where group2_.id=1 order by groupprofi1_.sort_nr asc 

Но когда я нажимаю флажок Я вижу, что оба запроса сверху выполняются много раз - для некоторые флажки он исполняет 15 раз, для других 25 раз и так далее ...

Что я делаю неправильно?

ответ

0

Хм, похоже, я «исправил» его. Но я более уверен, чем когда-либо, что то, что я делаю, даже тесно связано с тем, «как это следует делать». Было бы очень приятно, если бы кто-нибудь мог сказать мне, действительно ли мой код глуп и не прав, или если я пойду в правильном направлении здесь.

я изменил свое profileProducer так:

private Map<String, List<Profile>> cachedProfiles = new HashMap<String, List<Profile>>(); 

public List<Profile> getProfilesByFormAndName(String formName, String groupName) { 
    String key = formName + groupName; 
    if (!cachedProfiles.containsKey(key)) { 
     List<Profile> profiles = profileRepository.getProfilesByGroup(groupRepository.getGroupByFormAndName(formName, groupName)); 
     cachedProfiles.put(key, profiles); 
    } 
    return cachedProfiles.get(key); 
} 

Очевидно теперь не будет запрашивать eveytime базы данных - но я до сих пор не понимаю, почему он даже выполняет метод.

Я использую полностью неправильные бобы и/или аннотации?

Любой упрек/ввод будет очень желанным.

Редактировать: похоже, что я запрограммировал «обходной путь» (кэширование, как упоминалось в балусе, другой ответ сам).

edit2:

в конце концов, я в конечном итоге делает это как рекоммендуется Балус. Я получаю все данные в методе @PostConstruct и помещаю их в карту (с именем groupName + formName в качестве ключа), и в моем методе getter я просто их прочитал.

Смежные вопросы