2011-03-18 40 views
2

我正在將Grails應用程序部署到Amazon Web Services Elastic Beanstalk並利用RDS。我正在使用Grails,Spring-Security(RDS表)。該應用程序似乎工作正常(RDS中的登錄和數據被撤回)。但是,我第一次登錄時,我得到一個數據庫連接錯誤。第二次(立即)工作正常。我略有不同做的唯一的事情是試圖使用Java系統特性的連接字符串,用戶名和密碼來外部連接屬性:Elastic Beanstalk - >使用Grails的RDS連接錯誤

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 

我」什麼已經試過: 我追加autoReconnect的= true添加到JDBC_CONNECTION_STRING

我已經添加到了的conf /春/ resources.groovy:

beans = {  
    dataSource(BasicDataSource) { 

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

}

不過是在正確的地方,也可以/應添加到每個ENV配置DataSource.groovy文件?此外,如果我添加URL/driverClassName,用戶名和密碼,現在意味着它在多個位置,上述內容似乎是有效的。我還沒有確認它是否解決了這個問題,但是有沒有辦法讓每個環境都在一個地方?

回答

1

這應該工作:

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

我確認這工程... – Jon 2011-03-19 04:10:33

相關問題