Мы развертываем веб-приложение, основанное на Spring, в Tomcat, и мы хотели бы предоставить пользователю возможность использовать базу данных mongo для подключения. Для этого у нас есть мастер настройки, который фиксирует детали подключения монго от пользователя через онлайн-форму. После сбора этих деталей мы хотели бы динамически подключиться к Mongo. Сейчас мы загружаем Монго с помощью конфигурации XML:Динамическое обновление соединения базы данных Spring 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" />
Пользовательские значения сохраняются для чтения/записи в конфигурации картографа боба, но после установки их, мы хотим, чтобы в основном «перезагрузка» драйвер Монго. Для этого мы пытаемся:
XmlWebApplicationContext context = ((XmlWebApplicationContext) ContextLoader
.getCurrentWebApplicationContext());
context.refresh();
Это имеет хороший результат перегрузки всех наших applciation бобов, и мы можем увидеть даже бобы Mongo воссоздан в журнале вместе со всеми другими компонентами в контексте :
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'
Однако, когда мы идем использовать соединение, мы получаем следующую трассировку стека:
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)
мы думали, что, возможно, соединение монго не была должным образом закрываться таким образом, мы Бро t в нашей фасоли и закрыли ее перед перезагрузкой:
@Autowired
private Mongo mongo;
...
mongo.close();
XmlWebApplicationContext context = ((XmlWebApplicationContext) ContextLoader
.getCurrentWebApplicationContext());
context.refresh();
Но мы получаем то же исключение.
Кто-нибудь знает, как мы можем добиться динамического пересоединения монго без перезапуска нашего сервера приложений? Возможно, есть еще один способ решить эту проблему? Мы хотели бы предоставить конечным пользователям веб-конфигурацию GUI, а не редактировать файл конфигурации.
Спасибо за любые советы, которые вы можете предоставить.
Вы смогли это достичь? Могли ли вы динамически перезагрузить Spring-Data-Mongodb успешно? –
Я не смог понять это. – dev