问题
I developed an application on Grails 2.4.4 using jdk 1.7 and MySQL Workbench 6.3. It works for some time, but after some hours of the deployment i try to log in, it stops working and throws the exception "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)
I have an external file with the following configurations:
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
}
}
}
I also added port:3306
to my.cnf
file and mysqld : ALL : ACCEPT
to hosts.allow
file on /etc
folder.
Most of the properties were added after some research in another threads but it still doesnt work. Can anyone help me find a solution to solve this issue?
EDIT
After trying the solution given by Dipak Thoke it still throws the broken pipe exception. It also shows the following error
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.
Should i change the "wait_timeout" value? Cause i already have the "autoReconnect=true" property
回答1:
You need to c3p0 your project
step :1
Add this "BuildConfig.groovy"
dependencies {
// specify dependencies here under either 'build', 'compile'
compile 'c3p0:c3p0:0.9.1.2'
}
step 2:
Datasource groovy: Now your data source will be like this only remove the other things.
beans {
dataSource(BasicDataSource) {
**url = "jdbc:mysql://127.0.0.1/db_name"**
driverClassName = "com.mysql.jdbc.Driver"
username = "root"
password = "root"
pooled = true
}
}
For more info
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
Thanks
回答2:
With the solutions that were presented here my application was always getting a broken pipe exception. I created a webservice with a script the runs every hour, that way the application never loses its connection to the database. Since then the exception was never been thrown again. Thank you all for your answers anyway :)
来源:https://stackoverflow.com/questions/40214348/broken-pipe-exception-on-grails-app