Java 调用close方法后打开MongoDB连接的问题
我正在从事一个使用java和mongoDB作为后端数据库的web项目 .为了关闭打开的连接,我使用函数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
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();}