2011-03-18 5 views
2

Je suis en train de déployer une application Grails sur Amazon Web Services Elastic Beanstalk et de tirer parti de RDS. J'utilise Grails, Spring-Security (tables RDS). L'application semble fonctionner correctement (connexion et données dans RDS étant retiré). Cependant, de temps en temps, la première fois que je me connecte, j'obtiens une erreur de connexion à la base de données. La deuxième fois (immédiatement) fonctionne bien. La seule chose que je fais un peu différent essaie d'utiliser les propriétés du système Java pour la chaîne de connexion, le nom d'utilisateur et mot de passe pour extérioriser les propriétés de connexion:Elastic Beanstalk -> Erreur de connexion RDS en utilisant Grails

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") 
     } 
    } 

Trace de la pile:

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 

Qu'est-ce que je ai essayé: I = true autoreconnect apposé à l'JDBC_CONNECTION_STRING

Je l'ai ajouté à cONF/printemps/resources.groovy:

beans = {  
    dataSource(BasicDataSource) { 

     minEvictableIdleTimeMillis=1800000 
     timeBetweenEvictionRunsMillis=1800000 
     numTestsPerEvictionRun=3 
     testOnBorrow=true 
     testWhileIdle=true 
     testOnReturn=true 
     validationQuery="SELECT 1" 
    } 

}

est cependant que le bon endroit ou peut/doit-il être ajouté au fichier datasource.groovy par configuration env? En outre, ce qui précède semble seulement être valide si j'ajoute l'URL/driverClassName, le nom d'utilisateur, et le mot de passe qui signifie maintenant que c'est dans plusieurs endroits. Je n'ai pas confirmé si cela résout le problème, mais y a-t-il un moyen d'avoir tout cela dans un endroit par env?

Répondre

1

Cela devrait fonctionner:

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" 
      } 
     } 
} 
+0

J'ai confirmé que cela fonctionne ... – Jon

Questions connexes