but this seems like it would defeat the purpose of connection pooling.If only one user would be able to access the bean that
contains the MongoClient instance at a time, surely multiple
connections in the pool would never be used at the same time.
The javadoc
says:
The Java MongoDB driver is thread safe. 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.
So, when you create a singleton with the client in it. It can be re-used as mentioned in the Javadoc. No synchronization is required, since it is thread safe.
how would I go about only having one instance across my whole application?
One of the implementations could be:
public enum ConnectionFactory {
CONNECTION;
private MongoClient client = null;
private ConnectionFactory() {
try {
client = new MongoClient();
} catch (Exception e) {
// Log it.
}
}
public MongoClient getClient() {
if (client == null)
throw new RuntimeException();
return client;
}
}
and use the client as, throughout the application. Connection pooling
will be taken care by the MongoClient
as documented.
MongoClient client = ConnectionFactory.CONNECTION.getClient();
or use the @singleton annotation:
@Singleton
public class SingletonA {
}
Refer: http://tomee.apache.org/singleton-example.html