Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Cashbah MongoDB connections?

Note: I realise there is a similar question on SO but it talks about an old version of Casbah, plus, the behaviour explained in the answer is not what I see!

I was under the impression that Casbah's MongoClient handled connection pooling. However, doing lsof on my process I see a big and growing number of mongodb connections, which makes me doubt this pooling actually exists.

Basically, this is what I'm doing:

class MongodbDataStore {
  val mongoClient = MongoClient("host",27017)("database")

  var getObject1(): Object1 = {
    val collection = mongoClient("object1Collection")
    ...
  }

  var getObject2(): Object2 = {
    val collection = mongoClient("object2Collection")
    ...
  }
}

So, I never close MongoClient.

Should I be closing it after every query? Implement my own pooling? What then?

Thank you

like image 302
user1491915 Avatar asked Aug 04 '14 07:08

user1491915


1 Answers

Casbah is a wrapper around the MongoDB Java client, so the connection is actually managed by it.

According to the Java driver documentation (http://docs.mongodb.org/ecosystem/drivers/java-concurrency/) :

If you are using in a web serving environment, for example, you should create a single MongoClient instance, and you can use it in every request. The MongoClient object maintains an internal pool of connections to the database (default maximum pool size of 100). For every request to the DB (find, insert, etc) the Java thread will obtain a connection from the pool, execute the operation, and release the connection. This means the connection (socket) used may be different each time.

By the way, that's what I've experienced in production. I did not see any problem with this.

like image 160
Rotem Hermon Avatar answered Nov 16 '22 19:11

Rotem Hermon