根据我的代码要求,我需要获取一些用户相关信息,这些信息是根据对组织和用户组模型的几个DB调用计算的。根据我的绩效评估,这个过程有很多时间,因为这是在多个地方完成的。
根据快速获胜,我更喜欢在登录时只执行一次此操作,但我希望存储此信息,以便可以在整个门户网站中使用(在钩子中,在自定义portlet中,主题等。)。
为了实现这一点,我计划使用以下代码,只是希望检查是否有更好的解决方案(我在基于非Liferay的应用程序中使用会话,但总是遇到Liferay的一些网络钓鱼问题):
ServiceContext sc = ServiceContextThreadLocal.getServiceContext();
sc.setAttribute("some-user-data", someUserData);
-
在某些portlet / hook中,我这样做:
ServiceContext sc = ServiceContextThreadLocal.getServiceContext();
String someUserData = (String)sc.getAttribute("some-user-data");
谢谢! AJ
答案 0 :(得分:1)
AFAIK ServiceContext并不意味着能够在单个请求中存活。对于下一个处理的请求,ThreadLocal将被丢弃或重新初始化,因为该请求处理器处理的下一个请求很可能是为完全不同的用户处理的。
您可能希望查看缓存维度,以便从缓存而不是从数据库中提取组织和用户数据。我假设您正在使用Liferay的API来检索这些内容。
评论后编辑:在考虑所有其他选项后,我认为在会议中添加内容是最后的手段。首先检查缓存使用情况,确认通过这些调用确实浪费了大量时间,而不仅仅是第一个需要一段时间,后续操作被调用了很多次。并且不是在逐个请求的基础上验证这一点,而是在系统的实际使用情况下进行验证:如果您正在优化仅在系统的1%情况下执行的请求,并将其性能提高5%,你什么都没赢。相反,您最终会得到一个难以维护的系统,通过群集进行扩展,如果数据库在会话中保存数据后更新,则表现得很奇怪。