Java Mongodb连接失败

时间:2015-07-24 13:31:52

标签: java multithreading mongodb

我有一个java应用程序,它使用大约3000个可重用的线程,它总是在运行和处理队列中的项目。我使用MongoDB进行数据存储,每次运行它都能完美地运行大约40分钟,之后Mongo DB Object开始返回查询的Nullpointer异常。起初我怀疑这可能是由于连接丢失,但正如您在Google监控图中看到的那样,连接仍然是开放的,但Mongo查询的数量显着减少。我有什么遗失吗?

我的MongoDB类是这样的:

public class MongoDB {

    private static MongoClient mongoClient; 

    private static MongoClient initMongoClient() {
        ServerAddress server = new ServerAddress("X.X.X.X");

        MongoClientOptions.Builder builder = new MongoClientOptions.Builder();
        builder.threadsAllowedToBlockForConnectionMultiplier(50000);
        builder.socketKeepAlive(true);
        builder.connectionsPerHost(10000);
        builder.minConnectionsPerHost(2500);


        MongoClientOptions options = builder.build();
        MongoClient mc = new MongoClient(server, options);
        mongoClient = mc;
        return mc;
    }

    public static MongoClient getMongoClient() {
        if(mongoClient == null) {
            mongoClient = initMongoClient();
        }

        return mongoClient;
    }

    public static DB getDb() {
        DB db;
        MongoClient mc;
        try {
            mc = getMongoClient();
            mc.getDatabaseNames();
        } catch(MongoException e) {
            mc = initMongoClient();
        }
        db = mc.getDB("tina");
        return db;
    }

}

enter image description here

1 个答案:

答案 0 :(得分:1)

你应该切换到Morphia! https://github.com/mongodb/morphia

使用工厂模式生成单个Mongo实例并将其绑定到Morphia Datastore对象。然后,您可以使用Datastore对象与MongoDB进行交互。

public class DatastoreFactory {
    private static Datastore ds;

    public static Datastore getDatastore() {
        //Lazy load the datastore
        if(ds == null) {
            try {
                Morphia morphia = new Morphia();
                ds = morphia.createDatastore(
                    new MongoClient("server", port, "database"));
                //... Other datastore options
            } catch(Exception e) {
               // Handle it
            }
    }
    return ds;
}

然后,无论您需要MongoDB实例,只需使用Datastore对象并从工厂获取

Datastore ds = DatastoreFactory.getDatastore();

您也可以使用CDI注入数据存储区,如果这是您的

@Singleton
public class DatastoreFactory {
    private Datastore ds;

    @Produces
    public Datastore getDatastore() {
        //Lazy load the datastore
        if(ds == null) {
            try {
                Morphia morphia = new Morphia();
                ds = morphia.createDatastore(
                    new MongoClient("server", port, "database"));
                //... Other datastore options
            } catch(Exception e) {
               // Handle it
            }
    }
    return ds;
}

然后像这样注入

@Inject
Datastore ds;

<强>奖金

为了进一步将代码与MongoDB分离,创建数据访问对象(DAO)以访问包含Morphia数据存储对象的数据库将是正确的设计。您的DAO将具有您希望在数据库上使用的方法(获取,创建,保存,删除)。这样,如果你决定离开MongoDB,你只需要更改DAO对象而不是所有代码!