在JavaEE Web服务中使用单个MongoClient

Mat*_*ams 7 singleton java-ee mongodb mongo-java

在阅读了mongo文档后,说明MongoClient的每个实例都处理了自己的池,我怎样才能在整个应用程序中只有一个实例呢?

这似乎可能是使用单例bean的场景,但这似乎会破坏连接池的目的.如果一次只有一个用户能够访问包含MongoClient实例的bean,那么池中的多个连接肯定不会同时使用.

我对单身人士的理解是否错误,或者这确实是正确的方法吗?

Bat*_*eam 9

但这似乎会破坏连接池的目的.如果只有一个用户能够一次访问包含MongoClient实例的bean,那么池中的多个连接肯定不会同时使用.

javadoc说:

Java MongoDB驱动程序是线程安全的.例如,如果您在Web服务环境中使用,则应创建一个MongoClient实例,并且可以在每个请求中使用它.MongoClient对象维护与数据库的内部连接池(默认最大池大小为100).对于DB的每个请求(查找,插入等),Java线程将从池中获取连接,执行操作并释放连接.这意味着每次使用的连接(套接字)可能不同.

因此,当您使用客户端创建单例时.它可以像Javadoc中提到的那样重复使用.不需要同步,因为它是线程安全的.

我怎样才能在整个应用程序中只有一个实例?

其中一个实现可能是:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并在整个应用程序中使用客户端.Connection pooling将由MongoClient记录在案的人员照顾.

MongoClient client = ConnectionFactory.CONNECTION.getClient();
Run Code Online (Sandbox Code Playgroud)

或使用@singleton注释:

@Singleton
public class SingletonA {

}
Run Code Online (Sandbox Code Playgroud)

请参阅:http://tomee.apache.org/singleton-example.html