2015-05-13 3 views
4

Мы развертываем веб-приложение, основанное на 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, а не редактировать файл конфигурации.

Спасибо за любые советы, которые вы можете предоставить.

+1

Вы смогли это достичь? Могли ли вы динамически перезагрузить Spring-Data-Mongodb успешно? –

+0

Я не смог понять это. – dev

ответ

0

У меня была аналогичная проблема при доступе к базе данных из контекста весеннего приложения. После окончания дней исследований я наконец выяснил, что возникла проблема с синхронизацией и введена задержка после установки учетных данных базы данных, и до перезагрузки контекст снова решил проблему. По какой-то причине моя перезагрузка контекста была сделана слишком рано, и настройки базы данных еще не были установлены в то время, когда они пытались перезагрузить.

Как только была введена задержка, все приступило к работе, как ожидалось.

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^