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:3306
到my.cnf
文件和mysqld : ALL : ACCEPT
到hosts.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方法导致异常