动态重新加载Spring Mongo数据库连接而无需重新启动服务器

时间:2015-05-13 02:24:19

标签: java spring mongodb spring-data spring-mongo

我们正在Tomcat中部署基于Spring的Web应用程序,我们希望为用户提供连接到哪个mongo数据库的选项。为此,我们有一个设置向导,通过在线表单从用户捕获mongo连接详细信息。捕获这些细节后,我们想要动态连接到Mongo。现在我们通过xml配置加载我们的mongo:

<bean id="configmapper" class="com.db.util.ConfigurationMapper" />
<bean id="configmap" factory-bean="configmapper" factory-method="readXML" />
<mongo:mongo host="#{configmap.getHost()}" port="#{configmap.getPort()}" />
<mongo:db-factory dbname="#{configmap.getName()}"
    mongo-ref="mongo" />

用户值由config mapper bean读取/写入存储,但在设置之后,我们基本上想要&#34;重新启动&#34; mongo司机。要做到这一点,我们正在尝试:

XmlWebApplicationContext context = ((XmlWebApplicationContext) ContextLoader
            .getCurrentWebApplicationContext());
context.refresh();

这可以很好地重新加载我们所有的applciation bean,我们甚至可以看到在日志中重新创建了Mongo bean以及上下文中的所有其他bean:

DEBUG 2015-05-12 21:09:29,590 [http-nio-8087-exec-6] (DefaultSingletonBeanRegistry.java:221) - Creating shared instance of singleton bean 'mongo'
...
DEBUG 2015-05-12 21:09:08,121 [localhost-startStop-1] (DefaultSingletonBeanRegistry.java:221) - Creating shared instance of singleton bean 'mongoTemplate'
...
DEBUG 2015-05-12 21:09:29,590 [http-nio-8087-exec-6] (AbstractAutowireCapableBeanFactory.java:449) - Creating instance of bean 'mongoDbFactory'

但是,当我们使用连接时,我们得到以下stacktrace:

Caused by: java.lang.IllegalStateException: open
    at org.bson.util.Assertions.isTrue(Assertions.java:36)
    at com.mongodb.DBTCPConnector.isMongosConnection(DBTCPConnector.java:367)
    at com.mongodb.Mongo.isMongosConnection(Mongo.java:622)
    at com.mongodb.DBCollection.findOne(DBCollection.java:936)
    at com.mongodb.DBCollection.findOne(DBCollection.java:914)
    at com.mongodb.DBCollection.findOne(DBCollection.java:858)
    at org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2069)
    at org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2053)
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:1828)
    at org.springframework.data.mongodb.core.MongoTemplate.doFindOne(MongoTemplate.java:1645)
    at org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:560)

我们认为mongo连接可能没有正确关闭所以我们带来了我们的mongo bean并在重新加载之前将其关闭:

@Autowired
private Mongo mongo;
...
mongo.close();
XmlWebApplicationContext context = ((XmlWebApplicationContext) ContextLoader
                .getCurrentWebApplicationContext());
context.refresh();

但我们收到同样的例外。

有没有人知道如何在不重启我们的应用服务器的情况下实现动态mongo重新连接?也许还有另一种方法可以解决这个问题?我们希望为最终用户提供GUI Web配置,而不必自己编辑配置文件。

感谢您提供任何建议。

1 个答案:

答案 0 :(得分:0)

从spring应用程序上下文访问数据库时遇到了类似的问题。经过几天的调查后,我终于发现存在时间问题,并在设置数据库凭据之后引入延迟,并在重新加载上下文之前再次解决了问题。出于某种原因,我重新加载上下文的时间过早,并且在尝试重新加载时尚未设置数据库设置。

一旦引入延迟,一切都按预期开始工作。

我希望它有所帮助。