У меня есть маленькое приложение чаш Грааля, работающее на Tomcat в Ubuntu на VPS. Я использую MySql в качестве своего хранилища данных, и все хорошо работает, если я не оставляю приложение больше половины дня (8 часов?). Я сделал некоторый поиск, и по-видимому это - значение по умолчанию wait_timeout
в mysql.cnf поэтому после 8 часов умрет соединение, но Tomcat не будет знать поэтому, когда следующий пользователь попытается просмотреть сайт, они будут видеть ошибку сбоя соединения. Обновление страницы зафиксирует это, но я хочу избавиться от ошибки в целом. Для моей версии MySql (5.0.75) я имею только my.cnf, и это не содержит такой параметр, В любом случае изменение этого параметра не решает проблему.
Это Сообщение в блоге, кажется, сообщает о подобной ошибке, но я все еще не полностью понимаю то, что я должен настроить для получения зафиксированного, и также я надеюсь, что существует простое решение, чем другая сторонняя библиотека. Машина, на которой я работаю, имеет поршень 256 МБ, и я пытаюсь свести количество к минимуму выполнения программ/сервисов.
Есть ли что-то, что я могу настроить в Grails / Tomcat / MySql, чтобы заставить это уходить?
Заранее спасибо,
Gav
От моего Catalina.out;
2010-04-29 21:26:25,946 [http-8080-2] ERROR util.JDBCExceptionReporter - The last packet successfully received from the server was 102,906,722 milliseconds$
2010-04-29 21:26:25,994 [http-8080-2] ERROR errors.GrailsExceptionResolver - Broken pipe
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
...
2010-04-29 21:26:26,016 [http-8080-2] ERROR util.JDBCExceptionReporter - Already closed.
2010-04-29 21:26:26,016 [http-8080-2] ERROR util.JDBCExceptionReporter - Already closed.
2010-04-29 21:26:26,017 [http-8080-2] ERROR servlet.GrailsDispatcherServlet - HandlerInterceptor.afterCompletion threw exception
org.hibernate.exception.GenericJDBCException: Cannot release connection
at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.SQLException: Already closed.
at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:84)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:181)
... 1 more
Ссылаясь на эту статью , у вас есть устаревшие соединения в вашем пуле соединений DBCP, которые автоматически сбрасываются ОС или брандмауэром.
Решение состоит в том, чтобы определить запрос на валидацию и выполнить проверку работоспособности соединения, прежде чем вы фактически будете использовать его в своем приложении. В grails это фактически делается путем изменения grails-app / conf /spring/Resource.groovy и добавьте следующее:
beans = {
dataSource(BasicDataSource) {
//run the evictor every 30 minutes and evict any connections older than 30 minutes.
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
//test the connection while its idle, before borrow and return it
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
Попробуйте увеличить количество открытых подключений MySQL, поместив в свой DataSources.groovy следующее:
dataSource {
driverClassName = "com.mysql.jdbc.Driver"
pooled=true
maxActive=10
initialSize=5
// Remaining connection params
}
Если вы хотите сделать все возможное, попробуйте реализовать пул подключений; вот полезная ссылка по этому поводу.
Как выглядит ваша строка подключения JDBC? Вы можете установить параметр autoReconneect
в конфигурации вашего источника данных, например
jdbc:mysql://hostname/mydb?autoReconnect=true