【问题标题】:Setting a value to servicecontext in liferay在liferay中为servicecontext设置一个值
【发布时间】:2017-04-30 18:39:18
【问题描述】:

根据我的代码要求,我需要获取一些用户相关信息,这些信息是根据对组织和用户组模型的一些数据库调用计算得出的。根据我的绩效评估,这个过程花费了很多时间,因为这是在多个地方完成的。

为了快速获胜,我更喜欢在登录时只执行一次,但我希望存储此信息以便可以在整个门户中使用(在挂钩中,在自定义 portlet 中,在主题等)。

为了实现这一点,我打算使用以下代码,只是想检查是否有更好的解决方案(我在非 Liferay 的应用程序中使用了 session,但总是遇到 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");

谢谢! 阿杰

【问题讨论】:

    标签: liferay liferay-6


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果我从该服务上下文获取请求并从该服务上下文获取会话,例如 ServiceContextThreadLocal.getServiceContext().getRequest().getSession() 然后设置本次会议的价值观,你认为这样可以吗?这会导致我在“session.phishing.protected.attributes”属性的列表中添加每个属性吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2013-02-27
    • 2014-01-10
    • 2013-08-08
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多