繁体   English   中英

HttpServlet 和 MongoClient

[英]HtppServlet and MongoClient

我正在尝试使用 Jetty 和 HttpServlets 创建一个简单的 API 后端。 我在此处此处阅读有关 HttpServlets 线程安全的详细信息 普遍的共识似乎是,这是处理 HttpServlerts 中的变量访问的正确方法:

public class MyServlet extends HttpServlet {
    private static Object thisIsNotThreadsafe;
    private Object thisIsAlsoNotThreadsafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadsafe;

        thisIsNotThreadsafe = request.getParameter("foo"); // BAD! Shared among all requests.
        thisIsAlsoNotThreadsafe = request.getParameter("foo"); // BAD! Shared among all requests.
        thisIsThreadsafe = request.getParameter("foo"); // Good.
    }
}

我想要做的是创建一个新的MongoClient

MongoClient mongoClient = new MongoClient("localhost", 27017);

我可以将其设为“全局变量”,但这不是线程安全的。 每次调用doGetdoPost我都可以创建一个新实例。 但是 MongoDB 的 Java Driver Documentation 似乎也反对这样做:

具有内部连接池的 MongoDB 客户端。 对于大多数应用程序,您应该有一个用于整个 JVM 的 MongoClient 实例。

解决这个问题的最佳方法是什么?

如果MongoClient实例是线程安全的并且可以由多个线程共享而不会成为并发瓶颈,那么您可以为共享的MongoClient实例实现单例包装器。

根据 Mongo 文档似乎在说什么,这将是“最正确”的方法,特别是如果您有/可能有多个 servlet 类。

如果MongoClient情况不是线程安全的,等等,那么你就需要实现某种形式的(线程)连接池的MongoClient实例。


如果您使用的框架支持依赖注入 (DI),那么还有其他解决方案可以避免显式单例和池的一些问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM