2013-04-17 4 views
2

J'utilise mongodb-java-driver, et rien d'autre sauf cela. J'ai créé singleten EJB avec la connexion à Mongo.MonoDb crée une connexion à chaque opération sur la collection

@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; 
} 
} 

Je reçois ce ejb dans le haricot ApplicationScoped (JSF) (juste pour être sûr que je vais avoir une seule instance de connexion 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; 
} 
} 

Puis, en demande scope haricots j'obtenir des données de 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) 

} 

Pourquoi même si j'ai le même « db » instance d'objet, je ne peux pas obtenir des données sans créer de nouvelle connexion, pourquoi je peux ne partageons pas cette connexion comme elle devrait être due à la mise en commun? }

+0

Je vois le même comportement avec le pilote Node.Js MongoDb. Avez-vous eu de la chance pour savoir pourquoi cela se passe? –

+0

Je viens de trouver une réponse à votre question en résolvant un problème similaire. –

Répondre

0

Les pilotes MongoDB ouvrent de nouvelles connexions en arrière-plan chaque fois que vous travaillez avec une collection. Les conducteurs décident quand en ouvrir un nouveau. Je crois que cela dépend de la mise en œuvre du pilote.

Vous pouvez contrôler le nombre maximal de connexions ouvertes en définissant la valeur poolSize (la valeur par défaut est 5 pour le pilote Node.JS MongoDb http://mongodb.github.io/node-mongodb-native/2.2/api/MongoClient.html#connect). Il peut être différent pour Java ou d'autres langues. Vérifiez votre documentation.

Si vous souhaitez avoir plusieurs objets db, chaque objet aura son propre pool de connexions. Dans mon cas, j'ai mainDb et logsDb. Chacun a un pool de 10. Par conséquent, jusqu'à 20 connexions simultanées seront ouvertes.

Enfin, si vous utilisez le pilote node.js, assurez-vous de transmettre Number en tant que valeur et non en tant que chaîne (par exemple poolSize: 10). Cela vous permettra d'économiser des heures/jours de dépannage :)

Questions connexes