Проблема Тайм-аута Подключения mysql - Приложение Grails на использовании Tomcat В спящем режиме и ORM

У меня есть маленькое приложение чаш Грааля, работающее на 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

21
задан gav 29 April 2010 в 21:42
поделиться

3 ответа

Ссылаясь на эту статью , у вас есть устаревшие соединения в вашем пуле соединений 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"
  }
} 
18
ответ дан 29 November 2019 в 21:41
поделиться

Попробуйте увеличить количество открытых подключений MySQL, поместив в свой DataSources.groovy следующее:

dataSource {
     driverClassName = "com.mysql.jdbc.Driver"
     pooled=true
     maxActive=10
     initialSize=5
     // Remaining connection params
}

Если вы хотите сделать все возможное, попробуйте реализовать пул подключений; вот полезная ссылка по этому поводу.

1
ответ дан 29 November 2019 в 21:41
поделиться

Как выглядит ваша строка подключения JDBC? Вы можете установить параметр autoReconneect в конфигурации вашего источника данных, например

jdbc:mysql://hostname/mydb?autoReconnect=true
-1
ответ дан 29 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: