Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调用close方法后打开MongoDB连接的问题_Java_Web Services_Mongodb_Session_Enums - Fatal编程技术网

Java 调用close方法后打开MongoDB连接的问题

Java 调用close方法后打开MongoDB连接的问题,java,web-services,mongodb,session,enums,Java,Web Services,Mongodb,Session,Enums,我正在从事一个使用java和mongoDB作为后端数据库的web项目 .为了关闭打开的连接,我使用函数MongoDBClass.INSTANCE.close()在用户注销网站中的会话期间。但问题是,一旦用户再次登录会话,它会产生以下错误java.lang.IllegalStateException:状态应为:open。这意味着连接未打开,MongoDBClass实例未重新初始化,因此MongoClient不会重新打开连接。但在服务器重新启动后,登录首次工作正常。如何在注销用户会话期间调用clos

我正在从事一个使用java和mongoDB作为后端数据库的web项目 .为了关闭打开的连接,我使用函数
MongoDBClass.INSTANCE.close()
在用户注销网站中的会话期间。但问题是,一旦用户再次登录会话,它会产生以下错误
java.lang.IllegalStateException:状态应为:open
。这意味着连接未打开,
MongoDBClass实例
未重新初始化,因此
MongoClient
不会重新打开连接。但在服务器重新启动后,登录首次工作正常。如何在注销用户会话期间调用close方法后重新建立新连接,而无需重新启动服务器。我正在使用以下代码

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。但问题依然存在。
当我不关闭连接时,下次它成功连接时,但在这种情况下,open connections会快速启动。

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


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

在服务器启动和停止时打开和关闭连接。通过使用ServletContextListener,我已经修复了它。在我的情况下,当apache tomcat服务器启动时,到mongo db的连接将打开。当我停止tomcat时,它将关闭连接。我使用ServletContextListener在服务器启动和停止时打开和关闭一次。如@Override public void contextdestromed(servletcontext){mongodb.INSTANCE.close();}