【问题标题】:MonoDb creates connection every single operation on collectionMongoDb 在集合上的每个操作都创建连接
【发布时间】:2013-04-17 13:27:49
【问题描述】:

我正在使用 mongodb-java-driver,除此之外别无他法。我创建了与 Mongo 连接的单态 EJB。

@Singleton
public class MongoConnection {

private DB db = null;
private MongoClient mongoClient = null;

@PostConstruct
public void init() {
  try {
    mongoClient = new MongoClient("localhost", 27017);
    db = mongoClient.getDB("mydb");
  } catch (UnknownHostException e) {
    e.printStackTrace();
}
}

public MongoConnection() {
}

public DB getDb() {
  return db;
}
public DBCollection getCollectionInDatabase(String collection) {
  DBCollection coll;
  coll = db.getCollection(collection);
  return coll;
}
}

我在 ApplicationScoped bean (JSF) 中获得了这个 ejb(只是为了确定,我将只有一个 DB 连接实例)。

@Named("appMongo")
@ApplicationScoped
public class MongoApplicationScope implements Serializable{

private static final long serialVersionUID = 1L;
@EJB MongoConnection mu;


public MongoConnection getMu() {
return mu;
}

public void setMu(MongoConnection mu) {
this.mu = mu;
}
}

然后在请求范围的 bean 中,我从 db 获取数据

@Named("mongoBean")
@SessionScoped
public class MongoBean implements Serializable {

private static final long serialVersionUID = 1L;
@Inject MongoApplicationScope mongoAccess;
public void mongoDzialanie() {
DBCollection coll = mongoAccess.getMu().getDb().getCollection("oko"); //at this step everything is correct  
System.out.println(coll.getCount()); //new connection is created text from mongoDB console -> connection accepted from 127.0.0.1:57700 #2 (2 connections now open)

}

为什么即使我有相同的“db”对象实例,我也无法在不创建新连接的情况下获取数据,为什么我不能共享这个连接,因为它应该是由于池化? }

【问题讨论】:

  • 我看到 Node.Js MongoDb 驱动程序的行为相同。您是否有幸找到了发生这种情况的原因?
  • 我刚刚通过解决类似问题找到了您问题的答案。

标签: mongodb ejb mongodb-java nosql


【解决方案1】:

每次使用集合时,MongoDB 驱动程序都会在后台打开新连接。司机决定什么时候开一个新的。我相信这取决于驱动程序的实现。

您可以通过设置 poolSize 值来控制打开的最大连接数(Node.JS MongoDb 驱动程序http://mongodb.github.io/node-mongodb-native/2.2/api/MongoClient.html#connect 默认为 5)对于 Java 或其他语言可能会有所不同。检查您的文档。

如果您要拥有多个 db 对象,则每个对象都将拥有自己的连接池。就我而言,我有 mainDb 和 logsDb。每个池有 10 个。因此,最多将打开 20 个并发连接。

最后,如果您使用的是 node.js 驱动程序,请确保将数字作为值而不是字符串传递(即 poolSize:10)。这将为您节省数小时/数天的故障排除时间:)

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多