在阅读了 mongo 文档后,该文档说 MongoClient 的每个实例都处理自己的池,我该如何在整个应用程序中只拥有一个实例呢?
这看起来可能是使用单例 bean 的场景,但这似乎会违背连接池的目的。如果一次只有一个用户能够访问包含 MongoClient 实例的 bean,那么池中的多个连接肯定不会同时使用。
我对单例的理解是否错误,或者这确实是正确的方法?
但这似乎会破坏连接池的目的。如果只有一个用户能够访问该 bean
一次包含 MongoClient 实例,肯定是多个
池中的连接永远不会同时使用。
The javadoc
says:
Java MongoDB 驱动程序是线程安全的。如果您在网络中使用
服务环境,例如您should创建一个单一的
MongoClient 实例,您可以在每个请求中使用它。这
MongoClient 对象维护一个内部连接池
数据库(默认最大池大小为 100)。对于每一个请求
Java 线程将从 DB(查找、插入等)获取连接
池,执行操作,并释放连接。这
意味着每次使用的连接(套接字)可能不同。
因此,当您创建一个包含客户端的单例时。如 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;
}
}
并在整个应用程序中使用客户端。Connection pooling
将由MongoClient
如记录的那样。
MongoClient client = ConnectionFactory.CONNECTION.getClient();
或者使用@singleton注释:
@Singleton
public class SingletonA {
}
Refer: http://tomee.apache.org/singleton-example.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)