2017-04-30 16 views
0

根据我的代码要求,我需要获取一些用户相关信息,这些信息是基于组织和用户组模型的几个DB调用计算出来的。根据我的绩效评估,过程需要很长时间,因为这是在多个地方完成的。在liferay中为servicecontext设置一个值

根据快速获胜,我更喜欢在登录时只做一次,但是我希望存储这些信息,以便如果可以在整个门户中使用(在钩子中,在自定义portlet中,在主题等)。为了达到这个目的,我打算使用下面的代码,只是希望检查是否有更好的解决方案(我在非Liferay的应用程序中使用会话,但总是遇到与Liferay有关的钓鱼问题) :

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

-

,并在一些门户/挂机,我做的:

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

谢谢! AJ

回答

1

AFAIK ServiceContext并不是为了在单个请求中生存下来。 ThreadLocal将被丢弃或重新初始化以处理下一个请求,因为很可能由该请求处理器处理的下一个请求是为完全不同的用户处理的。

您可能想要查看缓存维度,以便组织和用户数据是从缓存而不是从数据库获取的。我假设你使用Liferay的API来检索这些。

在您的评论后编辑:我认为在所有其他选项都用尽之后,会将东西添加到会话中作为最后的手段。首先检查缓存使用情况,确认通过这些调用确实浪费了大量时间,而不仅仅是第一次需要一段时间,后续操作被调用了很多次。不要在逐个请求的基础上进行验证,而应根据您系统的实际使用情况进行验证:如果您正在优化仅在系统中1%的情况下执行的请求,并将其性能提高5% ,你一无所获。相反,你最终会遇到一个难以维护的系统,通过集群进行扩展,如果数据库在会话中保存数据后进行更新,那么这种行为会变得很奇怪。

+0

,如果我得到这个服务方面的请求,并从相同的获取会话,如** ServiceContextThreadLocal.getServiceContext()。Request()方法。的getSession()**,然后设置值到这个环节,你认为那会好吗? 这是否会导致我添加“session.phishing.protected.attributes”属性列表中的每个属性? – anjhawar