Mongodb 跨JavaEE web服务使用单个MongoClient
在阅读了mongo文档(其中说明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
这似乎是一个使用单例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环境中的方法。