The MemberListProducer generated by the Weld JEE6 archetype is like this:
@RequestScoped public class MemberListProducer { @Inject @MemberRepository private EntityManager em; private List<Member> members; // @Named provides access the return value via the EL variable name "member" in the UI (e.g., Facelets or JSP view) @Produces @Named public List<Member> getMembers() { return members; } public void onMemberListChanged(@Observes(notifyObserver = Reception.IF_EXISTS) final Member member) { retrieveAllMembersOrderedByName(); } @PostConstruct public void retrieveAllMembersOrderedByName() { CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Member> criteria = cb.createQuery(Member.class); Root<Member> member = criteria.from(Member.class); // Swap criteria statements if you would like to try out type-safe criteria queries, a new feature in JPA 2.0 // criteria.select(member).orderBy(cb.asc(member.get(Member_.name))); criteria.select(member).orderBy(cb.asc(member.get("name"))); members = em.createQuery(criteria).getResultList(); } }
Is it common to store the list of members, which will be the same for all the users, in the request scope? Isn't this going to consume a lot of extra memory, one list per request, rather than one list for the whole app?
Thanks in advance.
If your JPA implementation is using a second level cache, you'll be fine. In general though you probably would have a common app scoped list.