【问题标题】:Java servlet shared collection [duplicate]Java servlet共享集合[重复]
【发布时间】:2015-07-07 22:01:06
【问题描述】:

请帮助我。有没有办法可以使用在所有 Servlet 实例之间共享的集合?

我知道我可以在 HttpRequestContext 中保存一个字符串,但是如何存储一个集合?我知道我可以使用数据库,但我更愿意将所有内容存储在内存中

public class Servlet extends HttpServlet {

    public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      context.setAttribute("someValue", "aValue");
      //  Want to use collection here
  }

}

感谢您的回答。

【问题讨论】:

    标签: java http servlets collections


    【解决方案1】:

    您可以在请求、响应或会话中保存任何对象。当你检索它时,你只需要将它转换回正确的类。

    【讨论】:

      【解决方案2】:

      您可以将它存储在会话中 - 很常见。但也存在于外部类中的一些公共静态集合中——例如 Util.myCollection。不过要小心,servlet 应该是线程安全且无状态的,因此后者很容易被视为反模式 - 这样做会遇到很多麻烦。

      【讨论】:

      • 问题是我需要存储来自不同会话的数据。根据我从其他问题和 servlet 规范中看到的情况——如果我不使用 SingleThreadModel——这意味着 Servlet 容器中只有一个 Servlet 实例。所以这意味着 - 我可以将此集合存储在一个字段中,该字段将在所有线程处理请求之间共享(我只需要关心同步)。这个对吗?很抱歉问了一些愚蠢的问题,但我对 Java 和 Servlet 还是很陌生。谢谢你的回答!
      • 没错——如果没有明确定义,servlet 是容器范围内的单例。可能有很多线程在使用这个 servlet 实例(每个线程处理单个 HTTP 请求),所以您应该非常小心您在其中所做的事情。同步对共享集合的访问是线程安全的解决方案,但它会降低性能(传入线程将等待轮到它们)。如果您想共享/更新单个值,请尝试 java.util.concurrent.atomic 包,具体取决于您要存储的类型和您要交付的用例。
      • 对建议在所有会话中复制应用程序范围的数据表示反对。
      • 当然。感谢您指出这一点-不应那样使用会话。但同样......最终的解决方案将根据用例来选择。
      【解决方案3】:

      这取决于你想存储在哪里:

      • ServletContext.setAttribute():应用程序的生命周期。
      • HttpServletRequest.setAttribute():请求的生命周期。这将不适用于进一步的请求。
      • HttpServletSession.setAttribute():用于用户会话范围的生命周期。这仅适用于用户会话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-29
        • 2019-10-24
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多