Mongodb 跨JavaEE web服务使用单个MongoClient

Mongodb 跨JavaEE web服务使用单个MongoClient,mongodb,jakarta-ee,singleton,mongo-java,Mongodb,Jakarta Ee,Singleton,Mongo Java,在阅读了mongo文档(其中说明MongoClient的每个实例都处理自己的池)之后,我如何在整个应用程序中只使用一个实例呢 这似乎是一个使用单例bean的场景,但这似乎会破坏连接池的目的。如果一次只有一个用户能够访问包含MongoClient实例的bean,那么肯定不会同时使用池中的多个连接 我对单身人士的理解是否有误,或者这确实是正确的做法 但这似乎违背了连接池的目的 一次包含MongoClient实例,当然是多个实例 池中的连接永远不会同时使用 javadoc说明: Java MongoD

在阅读了mongo文档(其中说明MongoClient的每个实例都处理自己的池)之后,我如何在整个应用程序中只使用一个实例呢


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

我对单身人士的理解是否有误,或者这确实是正确的做法


但这似乎违背了连接池的目的 一次包含MongoClient实例,当然是多个实例 池中的连接永远不会同时使用

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;
    }
}
并在整个应用程序中使用客户端作为<代码>连接池将由
MongoClient
负责,如文件所述

MongoClient client = ConnectionFactory.CONNECTION.getClient();
或者使用@singleton注释:

@Singleton
public class SingletonA {

}

请参阅:

由于您处于java ee环境中,实现这一点的最佳方法是使用CDI生产者:

@Stateless
public class ConnetionFactory {

  @ApplicationScoped
  @Produces
  public MongoClient mongoClient() {
    return new MongoClient();
  }
}
然后在每个要在其中使用它的bean中:

@Stateless
public class MyServiceBean {

  @Inject
  private MongoClient mongoClient;
}

这将破坏连接池的目的您是否使用Spring来创建mongo客户端??不,我没有使用Spring,我使用的是JavaEE,很抱歉我应该在问题中提出这个问题(我已将其添加到标记中,并将更新问题标题)谢谢您的回答,这样做与使用
@Singleton
注释创建singletonbean be有什么区别?它会有同样的效果吗?@mattwillams-第一个是单例模式的
实现
,可以在普通java应用程序和java EE应用程序中使用,
@singleton
从开发人员那里抽象出单例模式的实现。因此,底层框架负责为类实现一个单例实例。我已经更新了我的答案,但没有你的评论。@BatScrem-太棒了,谢谢你澄清。因此,在我使用注释的
ConnectionFactory
(或我称之为它的任何东西)类中,我可以只拥有一个私有的MongoClient变量,在构造函数中实例化它,并拥有一个简单的getter。这些只能是单行方法吗?例如,在构造函数
client=new MongoClient()中作为注释和注入处理的情况下,您可以调用尚未实例化的getter,或者我仍然需要包括异常处理?我同意这是JavaEE环境中的方法。