Grails 应用程序上的断管异常

Posted

技术标签:

【中文标题】Grails 应用程序上的断管异常【英文标题】:Broken Pipe Exception on Grails App 【发布时间】:2017-03-05 23:46:23 【问题描述】:

我使用 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
        
    

我还在/etc文件夹中添加了port:3306my.cnf文件和mysqld : ALL : ACCEPThosts.allow文件。

大部分属性是在其他线程中进行一些研究后添加的,但它仍然不起作用。 谁能帮我找到解决这个问题的方法?

编辑

在尝试了 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”属性

【问题讨论】:

原因是池中的数据库连接有一段时间没有使用,连接被关闭,当应用程序尝试使用它时抛出异常。 你能重启你的应用吗 ***.com/questions/11125962/… 试试这个 github.com/vahidhedayati/kchat/blob/master/grails-app/conf/… 保持 autoReconnect=true 保持启用状态 【参考方案1】:

您需要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
   

更多信息

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

谢谢

【讨论】:

谢谢!我今天要试一试。几天后我会告诉你它是否有效:) 几分钟前我尝试登录应用程序,但显示了相同的异常。请查看我的编辑,我真的不知道还能做什么 我有一些问题@TelmaCruz 这个应用是处于生产模式还是开发模式? 处于生产模式 重启你的tomcat了吗??【参考方案2】:

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

【讨论】:

您为此编写了什么类型的脚本?你在里面写了什么? shell 脚本中的 curl 命令,在 linux 服务器中使用 cron 每小时运行一次

以上是关于Grails 应用程序上的断管异常的主要内容,如果未能解决你的问题,请参考以下文章

mysql上的Grails事务setSavePoint方法导致异常

Grails/Hibernate:版本控制上的空指针异常

IOException:断管

使用 selenium 运行 django-test 时出现断管错误

Grails 应用程序中的 MySql 损坏管道异常

使用石英的 grails 服务