Setting up MySQL connection pooling has been standard stuff in server-side apps for as long as I’ve been writing them, so I was at a loss when, every 5 days or so, my newly deployed app died with this exception:
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure Last packet sent to the server was 0 ms ago.
I’d already set up the driver with what I understood to be the correct reconnection properties – autoReconnectForPools=true and a validation query – in my Grails app:
dataSource { dbCreate = "update" driverClassName = "com.mysql.jdbc.Driver" username = "lourishbeta" password = "lourishbeta" url = "jdbc:mysql://${System.getProperty("dbHostName", "localhost")}/beta?autoReconnectForPools=true" properties { validationQuery = "select 1" maxActive = 150 } }
I initially thought it must be something to do with the (generally very reliable) CloudFoundry dropping the connection, but eventually I came upon this enormous thread on the MySQL forums which, in a very, very roundabout way gave the solution:
Use 127.0.0.1 instead of localhost.
So now my datasource looks like this:
dataSource { dbCreate = "update" driverClassName = "com.mysql.jdbc.Driver" username = "lourishbeta" password = "lourishbeta" url = "jdbc:mysql://${System.getProperty("dbHostName", "127.0.0.1")}/beta?autoReconnectForPools=true" properties { validationQuery = "select 1" maxActive = 150 } }
And the MySQL connection has been up for over 2 weeks. Phew!
Thanks a lot for this thread, man. Even I’ve been facing the same problem, except that when I changed the localhost in server.xml of tomcat to the IP of the system (not 127.0.0.1), it stopped working.