【发布时间】:2016-10-08 02:40:13
【问题描述】:
我正在尝试使用 Jetty 和 HttpServlets 创建一个简单的 API 后端。我已经阅读了 here 和 here 关于 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);
我可以将其设为“全局变量”,但这不是线程安全的。每次调用 doGet 或 doPost 时,我都可以创建一个新实例。但 MongoDB 的 Java 驱动程序文档似乎也反对这样做:
具有内部连接池的 MongoDB 客户端。对于大多数应用程序,您应该为整个 JVM 提供一个 MongoClient 实例。
最好的方法是什么?
【问题讨论】: