MongoDb 和 java :创建新的连接池并销毁前一个
MongoDb with java : create new connection pool and destroy the previous one
我正在 java 中实施 mongodb。每当我的应用程序启动时,都会为 mongoDB 创建新的连接池。有什么办法可以破坏该连接池并创建一个新连接池,而无需重新启动我的应用程序。我知道如果 mongoURI 中的任何参数发生变化,连接池就会重新初始化,但我想知道我们是否可以在不对 URI 进行任何更改的情况下做到这一点 arguments.By 主要目标是破坏连接池和创建新的连接池!这个连接池是由 MongoClient bean 创建的。因此我想销毁并重新创建 MongoClient Bean。
<bean id="monURI" class="com.mongodb.MongoClientURI">
<constructor-arg name="uri" value="${MONGO_URI}"/>
</bean>
<bean id="mongoC" class="com.mongodb.MongoClient">
<constructor-arg ref="monURI"/>
</bean>
您是否可以分享一些代码,以便我们对您的具体情况提供更多帮助?
在我工作的地方,我们正在使用 com.mongodb.MongoClient
。如果您也使用它,则可以在销毁连接管理器组件之前调用 mongoClient.close()
(使用 Spring,因此我们在组件的 @PreDestroy 方法中调用 close()
)
-------- 编辑 ------
根据我们对此答案的评论,我将采用以下任一方法:
- 用您自己的包含 MongoClient 实例的 class 包装 MongoClient。 class 将公开一个方法(我们称它为 resetConnectionPool),在该方法中你将调用
mongoClient.close()
和 mongoClient = new MongoClient()
.
您可能必须 @Autowire
MongoClientURI bean 才能在您创建的 class 中使用它。 class:
;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.net.UnknownHostException;
@Component
public class MongoClientWrapper {
@Autowired
private MongoClientURI mongoClientURI;
private MongoClient mongoClient;
@PostConstruct
public void init() {
mongoClient = getNewMongoClientInstance();
}
@PreDestroy
public void beforeTearDown() {
mongoClient.close();
}
public void resetConnectionPool() {
mongoClient.close();
mongoClient = getNewMongoClientInstance();
}
private MongoClient getNewMongoClientInstance() {
MongoClient client = null;
try {
client = new MongoClient(mongoClientURI.getURI());
} catch (UnknownHostException e) {
e.printStackTrace();
} finally {
return client;
}
}
}
- 重新考虑 MongoClient bean 的范围。也许不是单例,它应该是每个请求或每个 http 会话?查看这些链接以获取有关 bean 范围的更多信息:
- 根据此 javadoc:https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html 您可以向 URI 添加选项。您可以添加一个没有人使用但包含当前时间戳的选项。如果您想重置连接池,只需更改时间戳和 "changes" URI,从而重置您的连接池。大致如下:
mongodb://[用户名:密码@]host1:port1/dbName?_=1534228866003
----- 结束编辑 -----
我正在 java 中实施 mongodb。每当我的应用程序启动时,都会为 mongoDB 创建新的连接池。有什么办法可以破坏该连接池并创建一个新连接池,而无需重新启动我的应用程序。我知道如果 mongoURI 中的任何参数发生变化,连接池就会重新初始化,但我想知道我们是否可以在不对 URI 进行任何更改的情况下做到这一点 arguments.By 主要目标是破坏连接池和创建新的连接池!这个连接池是由 MongoClient bean 创建的。因此我想销毁并重新创建 MongoClient Bean。
<bean id="monURI" class="com.mongodb.MongoClientURI">
<constructor-arg name="uri" value="${MONGO_URI}"/>
</bean>
<bean id="mongoC" class="com.mongodb.MongoClient">
<constructor-arg ref="monURI"/>
</bean>
您是否可以分享一些代码,以便我们对您的具体情况提供更多帮助?
在我工作的地方,我们正在使用 com.mongodb.MongoClient
。如果您也使用它,则可以在销毁连接管理器组件之前调用 mongoClient.close()
(使用 Spring,因此我们在组件的 @PreDestroy 方法中调用 close()
)
-------- 编辑 ------
根据我们对此答案的评论,我将采用以下任一方法:
- 用您自己的包含 MongoClient 实例的 class 包装 MongoClient。 class 将公开一个方法(我们称它为 resetConnectionPool),在该方法中你将调用
mongoClient.close()
和mongoClient = new MongoClient()
.
您可能必须@Autowire
MongoClientURI bean 才能在您创建的 class 中使用它。 class:
;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.net.UnknownHostException;
@Component
public class MongoClientWrapper {
@Autowired
private MongoClientURI mongoClientURI;
private MongoClient mongoClient;
@PostConstruct
public void init() {
mongoClient = getNewMongoClientInstance();
}
@PreDestroy
public void beforeTearDown() {
mongoClient.close();
}
public void resetConnectionPool() {
mongoClient.close();
mongoClient = getNewMongoClientInstance();
}
private MongoClient getNewMongoClientInstance() {
MongoClient client = null;
try {
client = new MongoClient(mongoClientURI.getURI());
} catch (UnknownHostException e) {
e.printStackTrace();
} finally {
return client;
}
}
}
- 重新考虑 MongoClient bean 的范围。也许不是单例,它应该是每个请求或每个 http 会话?查看这些链接以获取有关 bean 范围的更多信息:
- 根据此 javadoc:https://mongodb.github.io/mongo-java-driver/3.4/javadoc/com/mongodb/MongoClientURI.html 您可以向 URI 添加选项。您可以添加一个没有人使用但包含当前时间戳的选项。如果您想重置连接池,只需更改时间戳和 "changes" URI,从而重置您的连接池。大致如下:
mongodb://[用户名:密码@]host1:port1/dbName?_=1534228866003
----- 结束编辑 -----