2016-01-22 2 views
0

У меня есть приложение Grails, которое связывается с базой данных ingres через классы домена. Когда происходит сбой базы данных, или я перезапустил в то время как приложение работает, я получаю исключение:Grails автоматически возобновляет соединение при ошибке

| Error Caused by: java.sql.SQLTransactionRollbackException: Connection failed. 

Это исключение тогда приходит каждый раз и навсегда, когда я получить доступ к базе данных Altough базы данных снова от перезапуска/сбоя.

Как заставить Grails/Hibernate воссоздать соединение или настроить его для автоматического создания.

Это мой конфиг:

dataSource { 
    dbCreate = 'validate' 
    url = "jdbc:ingres://xxx.xxx.xxx.xxx:II7/test" 
    driverClassName = "com.ingres.jdbc.IngresDriver" 
    username = "ingres" 
    password = "ingres" 
    jmxEnabled = true 
    initialSize = 5 
    maxActive = 50 
    minIdle = 5 
    maxIdle = 25 
    maxWait = 10000 
    maxAge = 10 * 60000 
    timeBetweenEvictionRunsMillis = 5000 
    minEvictableIdleTimeMillis = 60000 
    validationQuery = "SELECT 1" 
    validationQueryTimeout = 3 
    validationInterval = 15000 
    testOnBorrow = true 
    testWhileIdle = true 
    testOnReturn = true 
    jdbcInterceptors = "ConnectionState" 
    defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED 
} 

ответ

1

Проблема была легко исправить после нескольких часов поиска и отсутствие информации о ключах.

В моей начальной конфигурации в моем вопросе не было группы properties {..} вокруг параметров источника данных. Управление конфигурацией гениального Grails не предупредило меня о том, что это необходимо. Добавляя это, все работает отлично, и GORM может восстановить потерянные соединения.

0

java.sql.SQLTransactionRollbackException указывает на то, что последнее утверждение, которое может быть вызвано DB аварии автоматически откатывается в БД из-за тупиковой ситуации или других сбоев транзакции сериализации.

Тот факт, что перезапуск не разрешает эту проблему, может быть проблемой, связанной с драйвером. Кажется, что SQLState не сбрасывается (может по-прежнему содержать значение «40» или любое другое значение конкретного поставщика).

Возможно, основной фокус должен заключаться в том, чтобы указать причину аварии БД на уровне приложения. Перезапуск сервера БД во время работы приложения - это плохая практика.

1

Заканчивать параметр autoReconnect:

dataSource { 
    url = "jdbc:mysql://localhost/databaseName?useUnicode=yes&characterEncoding=UTF-8&autoReconnect=true" 
     } 

Другие свойства, которые могут быть полезны:

dataSource { 
    pooled = true 
    driverClassName = "com.mysql.jdbc.Driver" 
    username = "secret" 
    password = "santa" 

    properties { 
     maxActive = 50 
     maxIdle = 25 
     minIdle = 1 
     initialSize = 1 

     numTestsPerEvictionRun = 3 
     maxWait = 10000 

     testOnBorrow = true 
     testWhileIdle = true 
     testOnReturn = true 

     validationQuery = "select now()" 

     minEvictableIdleTimeMillis = 1000 * 60 * 5 
     timeBetweenEvictionRunsMillis = 1000 * 60 * 5 
    } 
} 
+0

Я не использовал 'свойства {}' в моей конфигурации (см. Вопрос). Это необходимо? –

+0

'validationQuery =" select now() "': 'now()' недоступен при входе. Вместо этого используйте 'select 1'. –

+0

Параметр 'autoReconnect' URL недоступен для драйвера Ingres JDBC. Однако он работает для mySQL. –

Смежные вопросы