MongoDb无法在分片环境中使用Java Driver插入文档

时间:2014-11-27 06:04:00

标签: mongodb

当我尝试连接到密钥"状态"通过jdbc,并插入文档,它说缺少shardKey

我的所有分片(2个没有,个别副本集的所有部分)和配置服务器(1个,副本集的一部分)已启动并运行,我可以使用mongos终端插入文档,但无法使用Java插入文档驱动程序。 mongodb版本是2.6.5。

package dao;

import util.InstanceFactory;

import com.mongodb.DB;
import com.mongodb.MongoClient;
import org.apache.log4j.Logger;

public class MongoConnector {

private static MongoConnector mongoConnectorInstance;

private DB DbConnection;

public static DB getConnection(String dbName) {

  MongoConnector.mongoConnectorInstance = InstanceFactory.instantiateAsSingleton(MongoConnector.class);

  if (MongoConnector.mongoConnectorInstance.DbConnection == null) {

    synchronized (MongoConnector.mongoConnectorInstance) {

      if (MongoConnector.mongoConnectorInstance.DbConnection == null) {
        MongoConnector.mongoConnectorInstance.DbConnection = MongoConnector.mongoConnectorInstance
.getDbConnection(dbName);
      }
    }
  }

  return MongoConnector.mongoConnectorInstance.DbConnection;

}

private DB getDbConnection(String dbName) {

  DB db = null;

  try {

    MongoClient mongoClient = new MongoClient("some ip address of mongos", 27017);

   // Now connect to your databases
   db = mongoClient.getDB(dbName);

   System.out.println("Connect to database successfully");

  } catch (Exception e) {
    System.err.println(e.getClass().getName() + ": " + e.getMessage());
  }

  return db;
  }
}

现在,当我尝试使用具有以下功能的其他类插入文档时,我得到shard key not present code 61

 public static boolean insert(DBObject object, String table) {
    boolean status = false;
    if (object != null) {
        try {
            DB db = MongoConnector.getConnection("somedb");
            DBCollection collection = db.getCollection(table);
            //System.out.println(collection);
            if (collection == null) {
                db.createCollection(table, null);
            }
            collection.insert(object);
            status = true;
        } catch (Exception e) {
            MongoDao.logger.error("Could not insert in database" + e);
        }
    }
    return status;
}

即将插入的对象看起来像

DBobject o=new BasicDBObject("SomeColumn":"somevalue")
           .append("shardKey":"UP");
MongoDAO.insert(o,"sometable");

我错过了一些配置连接到我的分片吗?

1 个答案:

答案 0 :(得分:1)

如果分片键为state,则问题在于构建文档:

DBobject o = new BasicDBObject("SomeColumn" : "somevalue")
    .append("shardKey" : "UP");

应该看起来像

DBobject o = new BasicDBObject("SomeColumn" : "somevalue")
    .append("State" : "UP");

看起来你没有正确设置分片键。

此外,还有一些关于分片设置的其他说明:

  1. 你说你有1个配置服务器。使用3.除了根本不关心的小型测试部署之外,不要使用1个配置服务器。使用3个配置服务器。

  2. 您说您的分片键有36个可能的值。这可能太少了。使用36个可能的值,您可以在分片之间分配最多36个可能的块。少量潜在的块会使MongoDB很难或不可能平衡分片之间的数据量。您需要重新考虑您的分片键。选择分片键是扩展MongoDB部署的关键部分,做出正确的选择需要大量有关系统用例的知识;您可以从手册中的some advice on choosing shard keys开始。