2017-04-30 4 views
0

내 코드 요구 사항에 따라 조직 및 사용자 그룹 모델에 대한 몇 가지 DB 호출을 기반으로 계산 된 사용자 관련 정보를 얻을 필요가 있습니다. 내 실적 리뷰에 따르면 여러 단계에서 진행되므로 많은 시간이 소요됩니다.값을 lifecay에서 servicecontext로 설정하십시오.

빠른 시간 내에 로그인 할 때 한 번만 수행하는 것이 좋지만이 정보를 저장하여 포털 전체에서 사용할 수 있도록하려면 (사용자 정의 포틀릿, 테마 등).

이 코드를 사용하려면 더 나은 솔루션이 있는지 확인하고 싶습니다 (Liferay 기반 애플리케이션이 아닌 세션에서 Liferay를 사용하여 피싱 문제를 해결했습니다)

ServiceContext sc = ServiceContextThreadLocal.getServiceContext(); 
String someUserData = (String)sc.getAttribute("some-user-data"); 

감사합니다 : - :

일부 포틀릿/후크에서, 내가 할

ServiceContext sc = ServiceContextThreadLocal.getServiceContext(); 
sc.setAttribute("some-user-data", someUserData); 

! AJ

답변

1

AFAIK ServiceContext는 단일 요청을 견디는 것이 아닙니다. ThreadLocal은 처리 된 다음 요청에 대해 버려지거나 다시 초기화됩니다.이 요청 처리기에서 처리되는 다음 요청은 완전히 다른 사용자에 대해 처리 될 가능성이 높기 때문입니다.

캐시 차원을보고 조직 및 사용자 데이터를 데이터베이스가 아닌 캐시에서 가져올 수 있습니다. 나는 Liferay의 API를 사용하여이를 검색한다고 가정하고 있습니다.

귀하의 코멘트를 남기고 편집 : 다른 모든 옵션을 모두 사용한 후에 마지막 수단으로 세션에 추가하는 것을 고려합니다. 처음에는 캐시 사용량을 확인하고 실제로 이러한 호출을 통해 많은 시간이 낭비되는 것을 확인하십시오. 첫 번째 호출에는 시간이 걸리고 이후 작업은 많은 시간이 호출되는 것이 아닙니다. 요청별로 요청하지 않고 시스템의 실제 사용에 대해 유효성을 검사하지 마십시오. 시스템의 1 %에서만 실행되는 요청을 최적화하고 성능을 5 % 너는 아무것도 얻지 못했다. 대신 유지 보수하기 어렵고, 클러스터를 통해 확장하고, 세션에서 데이터를 저장 한 후에 데이터베이스가 업데이트되면 이상한 행동을하는 시스템으로 끝을 맺을 것입니다.

+0

**이 서비스 컨텍스트에서 요청을 받고 ** ServiceContextThreadLocal.getServiceContext(). getRequest(). getSession() ** 같은 세션을 가져온 경우이 세션에 값을 설정하면 어떻게됩니까? 괜찮을 거라 생각해? 그러면 "session.phishing.protected.attributes"속성에 대한 목록의 각 속성을 추가 할 수 있습니까? – anjhawar