2015-02-12 3 views
1

Я разрабатываю приложение Grails с целью плагина Grails Mongo. Когда я запускаю приложение локально с помощью команды run-app, все работает хорошо, и приложение открывает 2 подключения к экземпляру Mongo.Grails Mongo - Tomcat не удается остановить создание соединений

Но когда я упаковываю приложение в файл войны и развертываю его на удаленном сервере Tomcat, поведение приложения запуска становится довольно странным.

Вот лог запуска:

??? 12, 2015 1:15:59 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/myapp] registered the JDBC driver [org.h2.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
??? 12, 2015 1:15:59 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/myapp] appears to have started a thread named [cluster-1-myapp.server:27017] but has failed to stop it. This is very likely to create a memory leak. 
??? 12, 2015 1:15:59 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads 
SEVERE: The web application [/myapp] appears to have started a thread named [MongoCleaner1332131781] but has failed to stop it. This is very likely to create a memory leak. 
??? 12, 2015 1:15:59 PM org.apache.catalina.startup.HostConfig deployWAR 
INFO: Deployment of web application archive /data/tomcat3/webapps/myapp.war has finished in 40,759 ms 
??? 12, 2015 1:16:04 PM org.apache.catalina.loader.WebappClassLoader loadClass 
INFO: Illegal access: this web application instance has been stopped already. Could not load org.bson.io.PoolOutputBuffer. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. 
java.lang.IllegalStateException 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1612) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) 
    at org.bson.BasicBSONDecoder.<init>(BasicBSONDecoder.java:599) 
    at com.mongodb.DefaultDBDecoder.<init>(DefaultDBDecoder.java:44) 
    at com.mongodb.DefaultDBDecoder$DefaultFactory.create(DefaultDBDecoder.java:33) 
    at com.mongodb.DBPort.<init>(DBPort.java:90) 
    at com.mongodb.ServerMonitor$ServerMonitorRunnable.run(ServerMonitor.java:87) 
    at java.lang.Thread.run(Thread.java:745) 

??? 12, 2015 1:16:29 PM org.apache.catalina.core.StandardContext startInternal 
SEVERE: Error listenerStart 
??? 12, 2015 1:16:29 PM org.apache.catalina.core.StandardContext startInternal 
SEVERE: Context [/app] startup failed due to previous errors 

Так что во время запуска приложения пытается получить MongoConnection в отдельном потоке Java и не только не закрывает эту тему.

Таким образом, каждый ~ 5 секунд Приложение открывает новые связи и MongoDB сервер затрачивает все доступные соединения:

> db.serverStatus().connections 
{ "current" : 6, "available" : 813, "totalCreated" : NumberLong(800) } 
> db.serverStatus().connections 
{ "current" : 45, "available" : 774, "totalCreated" : NumberLong(839) } 

Монго DB Сервер доступен из этого экземпляра сервера Tomcat и я могу подключиться к нему и извлечения данных.

Также stacktrace.log содержит следующую ошибку:

Caused by: com.mongodb.MongoTimeoutException: Timed out after 10000 ms while waiting for a server that matches AnyServerSelector{}. Client view of cluster state is {type=Unknown, servers=[{address=mongodb.host:27017, type=Unknown, state=Connecting}] 
    at com.mongodb.BaseCluster.getServer(BaseCluster.java:82) 
    at com.mongodb.DBTCPConnector.getServer(DBTCPConnector.java:650) 
    at com.mongodb.DBTCPConnector.access$300(DBTCPConnector.java:39) 
    at com.mongodb.DBTCPConnector$MyPort.getConnection(DBTCPConnector.java:499) 
    at com.mongodb.DBTCPConnector$MyPort.get(DBTCPConnector.java:447) 
    at com.mongodb.DBTCPConnector.authenticate(DBTCPConnector.java:620) 
    at com.mongodb.DBApiLayer.doAuthenticate(DBApiLayer.java:195) 
    at com.mongodb.DB.authenticateCommandHelper(DB.java:765) 
    at com.mongodb.DB.authenticate(DB.java:721) 
    at org.grails.datastore.gorm.mongo.bean.factory.GMongoFactoryBean.afterPropertiesSet(GMongoFactoryBean.java:149) 
    ... 5 more 

Любой сталкивался с такой же вопрос?

Спасибо!

ответ

0

Проблема была неправильной настройкой подключения драйвера MongoDB. Наш сервер MongoDB установлен в том же экземпляре с контейнером Tomcat. Но мы используем полный URL-адрес для подключения к MongoDB, например. app.server.com:27017. Драйвер не смог установить соединение, и Tomcat не смог убить пул потоков соединений.

В качестве решения этой проблемы вас 2 пути:

  1. использовать локальный в качестве соединения URL
  2. Настройка параметров bind_ip в конфигурационном файле MongoDB и предоставить IP сервера MongoDB есть