调用 close 方法后打开 MongoDB 连接时出现问题

Issue on opening MongoDB Connections after calling close Method

我正在开发一个使用 java 和 mongoDB 作为后端的 Web 项目 database.To 打开一个连接并为项目中包含的每个服务重复使用相同的连接,我我正在关注以下 URL mongodb open connection issue 。为了关闭已打开的连接,我在用户注销 Web site.But 会话期间使用函数 MongoDBClass.INSTANCE.close(); 问题是,一旦用户再次登录会话它会产生以下错误 java.lang.IllegalStateException: state should be: open。这意味着连接未打开,MongoDBClass INSTANCE 未重新初始化,因此 MongoClient 在服务器重新启动后未重新打开 connection.But 登录非常适合第一次。当我在注销用户会话期间调用关闭方法而不重新启动服务器时,如何再次建立新连接。我正在使用以下代码

public enum MongoDBClass {
    INSTANCE;

    private static final String MONGO_DB_HOST = "hostURL";
    private Mongo mongoObject;
    private DB someDB;
    String DB_NAME = null;
    MongoClientOptions options = null;

    MongoDBClass() {

        options = MongoClientOptions.builder().connectionsPerHost(100)
                .readPreference(ReadPreference.secondaryPreferred()).build();

        mongoObject = new MongoClient(new ServerAddress(MONGO_DB_HOST, 27001),
                options);
        someDB = mongoObject.getDB(Nutans_Mongo.getNameOFDB());}}

    public DB getSomeDB() {
        return someDB;
    }

    public void setSomeDB(String dbName) {
        someDB = mongoObject.getDB(dbName);
        DB_NAME = dbName;
    }    

    public String close() {
        mongoObject.close();
        return "true";
    }
}

我也遇到了同样的问题。我正在使用 Mongo Java 驱动程序 3.0.0。 我将我的数据库从 2.4 升级到 2.6。但问题仍然存在。 当我不关闭连接时,下次连接成功,但在这种情况下,打开的连接会迅速增加。

MongoClient 在内部维护一个连接池,因此不需要 open/close 每个请求的客户端。此外,Java 枚举不应该以这种方式使用。枚举的任何状态都应该是全局可用的,因为每个 ClassLoader/VM 只有一个枚举值实例。当您调用 close() 时,您将全局关闭该枚举的 MongoClient。由于您在构造函数中打开连接,因此它永远不会重新打开,因为永远不会创建另一个 INSTANCE

有几种方法可以确保 servlet 上下文中的对象具有类似单例的生命周期。使用 CDI 创建 MongoClient 并将其注入您的 servlet 是一种方法。使用 ServletContextListener 和静态字段是另一种方法,如果稍微不那么美味的话。