2013-05-11 4 views
2

사용자가 항목을 선택하는 드롭 다운 메뉴가 있는데, 여기서는 작업중인 프로젝트에서 웹 페이지에 표시된 대부분의 데이터가 해당 선택 항목에 따라 다릅니다. 그래서 나는 선택된 프로젝트에 의존하는 데이터베이스 쿼리를 수행하는 EJB bean을 호출하는 view scoped 빈을 몇 개 가지고있다.Observer 및 JSF ManagedBean

데이터베이스 쿼리를 줄이기 위해 대부분의 데이터를 캐시하고 싶지만 사용자가 프로젝트를 변경하면 변경 사항이 발생했으며 새 데이터를 가져와야한다는 사실을 다른 Bean에 알려야합니다.

  • projectChangeManager (세션 관리 빈을 범위), 선택된 프로젝트 저장이 가입자 때 프로젝트 변경의 통지 :

    그래서 나는 생각했다. @PreDestory 메소드는 클린업 옵저버 (cleanup observers)에서 구현되었습니다.

  • 프로젝트 관찰자 (범위가 지정된 관리 Bean보기)는 프로젝트 선택에 따라 EJB에서 데이터를 가져오고 EJB에서 새 데이터를 가져 오는 onProjectChange() 메소드를가집니다. @PreDestory 메소드는 projectChangeManager.detach (this)가 projectChangeManager에서 탈퇴하기 위해 호출 된 곳에서 구현되었습니다.

JSF에서 이러한 합리적인 접근 방식을 사용할 수 있습니까? 또는 관찰자 패턴을 구현하지 않는 것이 좋지만 사용자가 프로젝트를 변경하면 캐시 된 모든 데이터를 가져 와서 세션 빈에 저장 한 다음 ViewScoped 빈에 저장하면 SessionScoped 빈에서 해당 데이터에 액세스 할 수 있습니까? 아니면 더 좋은 방법이 있습니까?

답변

1

내게는 이것이 과장된 것처럼 보입니다. 처음에는 모든 관리 Bean에 데이터가 필요할 때마다 저장소/EJB를 호출하게 할 것입니다. 그런 다음 영속 계층 (JPA/Hibernate/사용하는 모든 것)에서 캐싱을 사용하십시오.

성능에 문제가있는 것으로 판명되면 일부 수동 캐싱 솔루션을 고려해 볼 수 있습니다.

그런 경우에도 나는 아직도 당신의 옵서버 접근법의 이점을 잘 보지 못합니다. 두 번째 방법 (세션 빈의 캐시, ViewScoped Bean의 액세스)은 더 단순 해 보이며 올바르게 작동해야합니다.

마지막으로 캐싱을 사용하려면 부실 캐시를 피하는 방법을 고려하십시오. 세션 당 캐시하면 한 세션의 변경 사항이 다른 세션에서 표시되지 않습니다. 덧붙여서, 이것이 퍼시스턴스 레이어에 캐싱을 남기는 또 다른 이유라고 생각합니다.

관련 문제