Grails App上的断管异常

时间:2016-10-24 08:57:28

标签: mysql grails broken-pipe

我使用jdk 1.7和MySQL Workbench 6.3在Grails 2.4.4上开发了一个应用程序。它工作了一段时间,但在部署几个小时后我尝试登录,它停止工作并抛出异常“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.cnfmysqld : 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”属性

2 个答案:

答案 0 :(得分:0)

您需要 c3p0 您的项目

步骤:1

添加此" BuildConfig.groovy"

getSelectedContexts()

第2步:

Datasource groovy: 现在你的数据源就像这样只删除其他内容。

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

        compile 'c3p0:c3p0:0.9.1.2'
    }

了解更多信息

Do I need to use C3P0 pooling library in my (grails) web application?

How do I configure c3p0 for a grails 2.X application with multiple datasources?

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

谢谢

答案 1 :(得分:0)

使用此处提供的解决方案,我的应用程序始终会出现损坏的管道异常。我创建了一个带有脚本的webservice,每小时运行一次,这样应用程序永远不会失去与数据库的连接。从那时起,异常再也没有被抛出。无论如何,谢谢大家的答案:)