【问题标题】:Issue on opening MongoDB Connections after calling close Method调用 close 方法后打开 MongoDB 连接的问题
【发布时间】:2015-05-05 05:45:14
【问题描述】:

我正在开发一个使用 java 和 mongoDB 作为后端数据库的 Web 项目。要打开一次连接并为项目中包含的每个服务重复使用相同的连接,我遵循以下 URL mongodb open connection issue。为了关闭打开的连接,我在用户注销网站会话期间使用函数MongoDBClass.INSTANCE.close();。但问题是,一旦用户再次登录会话,它会产生以下错误@ 987654323@。这意味着连接没有打开,MongoDBClass INSTANCE 没有重新初始化所以MongoClient 没有重新打开连接。但是在服务器重新启动后,登录第一次完美运行。当我在注销用户会话期间调用关闭方法而不重新启动服务器后如何再次建立新连接。我正在使用以下代码

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";
    }
}

【问题讨论】:

    标签: java web-services mongodb session enums


    【解决方案1】:

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

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

    【讨论】:

    • 我使用 ServletContextListener 在服务器启动和停止时打开和关闭一次。像 @Override public void contextDestroyed(ServletContextEvent contextEvent) { mongodb.INSTANCE.close(); }
    【解决方案2】:

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

    【讨论】:

    • 在服务器启动和停止时打开和关闭连接。通过使用 ServletContextListener 我已修复它。在我的情况下,当 apache tomcat 服务器启动时,与 mongo db 的连接将打开。当我停止 tomcat 时,它将打开关闭连接
    猜你喜欢
    • 1970-01-01
    • 2017-05-08
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多