Исключение Broken Pipe в приложении Grails

Я разработал приложение на Grails 2.4.4, используя jdk 1.7 и MySQL Workbench 6.3. Некоторое время он работает, но после нескольких часов развертывания, когда я пытаюсь войти в систему, он перестает работать и выдает исключение «java.net.SocketException: Broken pipe».

2016-10-24 09:40:53,599 [http-nio-8080-exec-12] ERROR errors.GrailsExceptionResolver  - SocketException occurred when processing request: [POST] /login/autenticacao
Broken pipe. Stacktrace follows:
java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
    at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3832)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2471)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322)
    at org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.doCall(GormStaticApi.groovy:102)
    at sig.PasswordEncrypt.verificaAutenticacao(PasswordEncrypt.groovy:25)
    at sig.LoginController$_closure1.doCall(LoginController.groovy:20)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

У меня есть внешний файл со следующими конфигурациями:

   beans{
    dataSource(BasicDataSource) {
        url = "jdbc:mysql://127.0.0.1/db_name?autoReconnect=true"
        username = "root"
        password = "root"
        pooled = true
        properties {
            jmxEnabled = true
            initialSize = 5
            maxActive = 50
            maxAge = 10 * 60000
            jdbcInterceptors = "ConnectionState"
            validationInterval = 15000
            minIdle = 5
            maxIdle = 25
            maxWaitMillis = 0
            timeBetweenEvictionRunsMillis = 1000 * 60 * 30
            numTestsPerEvictionRun = 3
            minEvictableIdleTimeMillis = 1000 * 60 * 30
            validationQuery = "SELECT 1"
            validationQueryTimeout = 3
            testOnBorrow = true
            testWhileIdle = true
            testOnReturn = true
            defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
        }
    }
}

Я также добавил port:3306в my.cnf файл и mysqld : ALL : ACCEPT в hosts.allow файл в папке /etc.

Большинство свойств были добавлены после некоторых исследований в других потоках, но они все еще не работают. Может ли кто-нибудь помочь мне найти решение для решения этой проблемы?

ИЗМЕНИТЬ

После попытки решения, данного Dipak Thoke, он по-прежнему выдает исключение сломанной трубы. Он также показывает следующую ошибку

2016-10-25 09:03:33,683 [http-nio-8080-exec-37] ERROR spi.SqlExceptionHelper  - The last packet successfully received from the server was 38,766,997 milliseconds ago.  The last packet sent successfully to the server was 38,766,997 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

Должен ли я изменить значение «wait_timeout»? Потому что у меня уже есть свойство "autoReconnect=true"


person Telma Cruz    schedule 24.10.2016    source источник
comment
Причина заключалась в том, что соединения с базой данных в пуле не использовались в течение некоторого времени, и соединение было закрыто, и когда приложение пыталось использовать это, оно выдавало исключение.   -  person Dipak Thoke    schedule 24.10.2016
comment
Можете ли вы перезапустить приложение   -  person Dipak Thoke    schedule 24.10.2016
comment
stackoverflow.com/questions/11125962/ попробуйте это github.com/vahidhedayati/kchat/blob/master/grails-app/conf/ оставьте autoReconnect=true включен как есть   -  person V H    schedule 25.10.2016


Ответы (2)


Вам нужно c3p0 свой проект

шаг :1

Добавьте этот «BuildConfig.groovy»

dependencies {
        // specify dependencies here under either 'build', 'compile'

        compile 'c3p0:c3p0:0.9.1.2'
    }

шаг 2:

Источник данных отличный: теперь ваш источник данных будет таким, только удалите все остальное.

beans {
    dataSource(BasicDataSource) {
        **url = "jdbc:mysql://127.0.0.1/db_name"**
        driverClassName = "com.mysql.jdbc.Driver"
        username = "root"
        password = "root"
        pooled = true
   }
}

Для получения дополнительной информации

Нужно ли мне использовать C3P0 объединить библиотеку в моем веб-приложении (grails)?

Как настроить c3p0 для приложения Grails 2.X с несколькими источниками данных?.

http://blog.nutpan.com/2013/07/grails-broken-pipe-and-cannot-release.html

Спасибо

person Dipak Thoke    schedule 24.10.2016
comment
Спасибо! Я собираюсь попробовать это сегодня. На днях отпишусь, получилось ли :) - person Telma Cruz; 24.10.2016
comment
Я попытался войти в приложение несколько минут назад, и было показано то же исключение. Пожалуйста, проверьте мою правку, я действительно не знаю, что еще делать - person Telma Cruz; 25.10.2016
comment
У меня есть несколько вопросов @TelmaCruz, это приложение находится в рабочем режиме или в режиме разработки? - person Dipak Thoke; 25.10.2016
comment
Это в производственном режиме - person Telma Cruz; 25.10.2016
comment
Перезагрузите свой кот ?? - person Dipak Thoke; 25.10.2016
comment
Не в последнее время.. последний раз, когда я это делал, я думаю, это было на прошлой неделе. - person Telma Cruz; 25.10.2016
comment
если ваше соединение mysql идеально подходит для более чем 9 часов, то есть запрос не отправляется в базу данных, тогда пул соединений закрывается, поэтому нужен плагин c3p0, который используется для целей пула? поэтому, пожалуйста, перезапустите кота... - person Dipak Thoke; 25.10.2016
comment
я перезапустил его сейчас .. вчера я добавил c3p0 в свои зависимости, поэтому я думал, что к настоящему времени это будет исправлено .. посмотрим, будет ли он работать завтра - person Telma Cruz; 25.10.2016
comment
После перезапуска tomcat ваша проблема исчезла? - person Dipak Thoke; 25.10.2016
comment
Он перестает работать только ночью, через несколько часов после последнего доступа, поэтому я могу быть уверен, что проблема будет решена только завтра утром, вероятно ... сейчас я просто снова скопировал файл войны на сервер, перезапустил tomcat, и теперь мне подождите, чтобы увидеть, если это произойдет снова - person Telma Cruz; 25.10.2016
comment
Все еще не повезло, ошибка wait_timeout исчезла, но я все еще получаю исключение сломанной трубы - person Telma Cruz; 26.10.2016
comment
По прошествии всего этого времени он по-прежнему выдает исключение о сломанной трубе. Я проверил ссылки, которые вы разместили, но, похоже, ничего не работает. я не знаю что еще делать - person Telma Cruz; 03.11.2016

С решениями, которые были представлены здесь, мое приложение всегда получало исключение сломанной трубы. Я создал веб-сервис со сценарием, который запускается каждый час, поэтому приложение никогда не теряет связь с базой данных. С тех пор исключение больше никогда не вызывалось. Всем спасибо за ответы в любом случае :)

person Telma Cruz    schedule 14.11.2016
comment
Какой тип сценария вы написали для этого? что вы там написали? - person Dipak Thoke; 14.11.2016
comment
команда curl в сценарии оболочки, которая запускается каждый час с помощью cron на сервере Linux - person Telma Cruz; 15.11.2016