2015-05-13 63 views
4

我們正在Tomcat中部署基於spring的web應用程序,我們希望爲用戶提供一個連接哪個mongo數據庫的選項。爲此,我們有一個設置嚮導,通過在線表單捕捉用戶的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豆的美好結果,我們甚至可以看到蒙戈豆類在日誌中與上下文中的所有其他豆類重新創建沿:

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) 

我們也許認爲蒙戈連接沒有正確關閉,使我們布拉夫噸,並在重新加載之前關閉它:

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

但我們收到相同的異常。

有誰知道我們如何才能實現動態mongo重新連接,而無需重新啓動我們的應用程序服務器?也許還有另一種解決這個問題的方法?我們希望爲最終用戶提供一個GUI Web配置,而不必自己編輯配置文件。

感謝您提供任何建議。

+1

你能達到這個目標嗎?你能夠動態地重新加載Spring-Data-Mongodb嗎? –

+0

我還沒有弄清楚這一點。 – dev

回答

0

從彈簧應用程序上下文訪問數據庫時,我遇到了類似的問題。經過數天的調查後,我終於發現有一個計時問題,並且在設置數據庫憑證之後並且在重新加載上下文之前引入了延遲解決了問題。出於某種原因,我重新加載上下文的時間過早,數據庫設置在嘗試重新加載時尚未設置。

一旦延遲被引入,一切都開始按預期工作。

我希望它有幫助。

相關問題