[英]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);
我可以将其设为“全局变量”,但这不是线程安全的。 每次调用doGet
或doPost
我都可以创建一个新实例。 但是 MongoDB 的 Java Driver Documentation 似乎也反对这样做:
具有内部连接池的 MongoDB 客户端。 对于大多数应用程序,您应该有一个用于整个 JVM 的 MongoClient 实例。
解决这个问题的最佳方法是什么?
如果MongoClient
实例是线程安全的并且可以由多个线程共享而不会成为并发瓶颈,那么您可以为共享的MongoClient
实例实现单例包装器。
根据 Mongo 文档似乎在说什么,这将是“最正确”的方法,特别是如果您有/可能有多个 servlet 类。
如果MongoClient
情况不是线程安全的,等等,那么你就需要实现某种形式的(线程)连接池的MongoClient
实例。
如果您使用的框架支持依赖注入 (DI),那么还有其他解决方案可以避免显式单例和池的一些问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.