Ошибка устаревшего соединения Grails / Tomcat / MySQL, даже при использовании JNDI? - PullRequest
1 голос
/ 16 ноября 2010

У меня есть пара приложений Grails 1.3.3, работающих на Tomcat 6.0.18. Мне известно о проблеме устаревания соединения с базой данных при использовании источника данных Grails по умолчанию (соединение прерывается после определенного периода бездействия), поэтому я переключился на JNDI, предоставленный Tomcat.

В первом развернутом приложении никогда не возникало проблем с подключением к базе данных. Теперь я развернул второе приложение на том же сервере с той же конфигурацией источника данных JNDI, и, хотя первое продолжает работать нормально, второе приложение получает ошибку времени ожидания соединения после примерно 8 часов бездействия. (После ошибки соединение обновляется и снова работает нормально)

Источники данных определены в Tomcat context.xml следующим образом:

<Resource name="jdbc/firstDs" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        username="user1" password="password1" driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/firstApp" />

<Resource name="jdbc/secondDs" auth="Container" type="javax.sql.DataSource"
    maxActive="100" maxIdle="30" maxWait="10000"
    username="user2" password="password2" driverClassName="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/secondApp" />

Оба приложения используют источник данных JNDI в файле Datasource.groovy следующим образом (все точно так же, за исключением jndiName):

dataSource {
    pooled = false
}
...
environments {
    ...
    production {
        dataSource {
            dbCreate = "update"
            jndiName = "java:comp/env/jdbc/firstApp"
        }
    }
}

Разница ONLY , о которой я знаю, между этими двумя ситуациями заключается в том, что работающее приложение использует таблицы MyISAM, а нерабочее приложение использует таблицы InnoDB. Кто-нибудь испытывал проблему с пулами соединений InnoDB и Tomcat? Я могу попробовать перейти на MyISAM, если я не могу найти что-нибудь еще, чтобы попробовать.

1 Ответ

3 голосов
/ 18 ноября 2010

Для MySQL и Grails лучше всего иметь проверочный запрос в пуле БД. Вы можете добавить к своим определениям:

validationQuery="SELECT 1"

См. Также http://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html#JDBC_Data_Sources

...