Elastic Beanstalk -> RDS -ошибка с помощью Grails
-
27-10-2019 - |
Вопрос
Я развертываю приложение Grails в Amazon Web Services Elastic Beanstalk и использую RDS. Я использую Grails, Spring-Security (таблицы RDS). Приложение, по -видимому, работает нормально (вход в систему и данные в RDS возвращаются). Тем не менее, время от времени в первый раз, когда я вхожу в систему, я получаю ошибку подключения к базе данных. Второй раз (сразу) работает нормально. Единственное, что я делаю, немного по -другому, - это попытаться использовать свойства системы Java для строки подключения, имени пользователя и пароля для внешнего вида свойств соединения:
production {
dataSource {
url = System.getProperty("JDBC_CONNECTION_STRING")
driverClassName = "com.mysql.jdbc.Driver"
dbCreate = "validate"
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
username = System.getProperty("PARAM1")
password = System.getProperty("PARAM2")
}
}
Трассировки стека:
Caused by: org.hibernate.TransactionException: JDBC begin failed:
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:96)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:555)
... 80 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 41,541,715 milliseconds ago. The last packet sent successfully to the server was 41,541,716 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.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3358)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1970)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)
at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:5022)
at org.apache.commons.dbcp.DelegatingConnection.setAutoCommit(DelegatingConnection.java:371)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.setAutoCommit(PoolingDataSource.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:616)
at org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy$TransactionAwareInvocationHandler.invoke(TransactionAwareDataSourceProxy.java:239)
at $Proxy11.setAutoCommit(Unknown Source)
at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:91)
... 82 more
Caused by: java.net.SocketException: Connection timed out
at java.net.SocketOutputStream.socketWrite0(Native Method)
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:3339)
... 95 more
Что я пробовал: я приложил?
Я добавил это в conf/spring/resources.grovy:
beans = {
dataSource(BasicDataSource) {
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
Однако это правильное место или может быть/может быть добавлено в файл DataSource. Кроме того, вышеперечисленное кажется действительным, только если я добавляю URL/DriverClassName, имя пользователя и пароль, что теперь означает, что это в нескольких местах. Я не подтвердил, решает ли это проблему, но есть ли способ иметь все это в одном месте на Env?
Решение
Это должно работать:
production {
dataSource {
url = System.getProperty("JDBC_CONNECTION_STRING")
driverClassName = "com.mysql.jdbc.Driver"
dbCreate = "validate"
dialect = org.hibernate.dialect.MySQL5InnoDBDialect
username = System.getProperty("PARAM1")
password = System.getProperty("PARAM2")
//configure DBCP
properties {
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}