java - Mongo 连接泄漏与吗啡

标签 java mongodb morphia

我有一个带有 static Mongo = new Mongo()Morphia morphia = new Morphia() 对象的 Servlet。每次调用 GET 时,我都会执行以下操作:

doGet(...){
...
datastore = morphia.createDatastore(mongo, dbName);
...
}

我没有关闭datastore,因为没有关闭方法。每次我调用 servlet 时,mongo 中使用的连接数都会增长:

{ "current" : 113, "available" : 706, "totalCreated" : NumberLong(122) }
> db.serverStatus().connections { "current" : 115, "available" : 704, "totalCreated" : NumberLong(124) }
> db.serverStatus().connections { "current" : 116, "available" : 703, "totalCreated" : NumberLong(125) }
> db.serverStatus().connections { "current" : 121, "available" : 698, "totalCreated" : NumberLong(130) }
> db.serverStatus().connections { "current" : 122, "available" : 697, "totalCreated" : NumberLong(131) }
> db.serverStatus().connections { "current" : 128, "available" : 691, "totalCreated" : NumberLong(137) }

关闭与 mongo 和 morphia 的连接的正确方法是什么?连接真正泄漏的地方是什么?谢谢。

最佳答案

您可以创建一个单例 Datastore 对象

public enum MongoDBHelper { // the best way to implement singletons, due to the author of Effective Java  
INSTANCE;

private DB db;
private Datastore datastore;

private final String SERVER_URL = "...";
private final int SERVER_PORT = ...;
private final String USERNAME= "...";
private final String PASSWORD = "...";
private final String DATABASE_NAME = "...";

private MongoDBHelper() {

    try {

        MongoClient mongoClient = new MongoClient(SERVER_URL, SERVER_PORT);

        this.db = mongoClient.getDB(DATABASE_NAME);
        this.db.authenticate(USERNAME,PASSWORD.toCharArray());

        Morphia morphia = new Morphia();

        this.datastore = morphia.createDatastore(mongoClient, DATABASE_NAME);

        morphia.mapPackage("package");
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }

}

public DB getDB() {
    return this.db;
}

public Datastore getDatastore() {
    return this.datastore;
}
}

现在您可以在您的应用程序中重用相同的 Datastore 对象

 Datastore datastore = MongoDBHelper.INSTANCE.getDatastore()

关于java - Mongo 连接泄漏与吗啡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21580147/

相关文章:

java - 使用 bouncy caSTLe 生成 dsa/elgamal key 对,在 GPG 中导入时不会出错

java - 在 Mac OS X 上配置 JNotify

spring - 如何删除 Mongo 中嵌套对象的唯一索引

node.js - 定时器删除记录+一个条件

java - 使用 elem 对子文档数组进行 Morphia 查询

java - 如何在morphia和mongodb中通过外键(dbref)查找记录?

mongodb - 使用 MongoDB 时玩框架测试和访问 session 对象

java - 从其他类调用时的类层次结构方法

java - Android Java 使图像向下移动

mongodb 副本集成员无法通过 SSL 加入集群