I saw that ?autoReconnect=true wasn't working for me.
What I did, is simply creating a function called: executeQuery with:
private ResultSet executeQuery(String sql, boolean retry) {
    ResultSet resultSet = null;
    try {
        resultSet = getConnection().createStatement().executeQuery(sql);
    } catch (Exception e) {
            // disconnection or timeout error
        if (retry && e instanceof CommunicationsException || e instanceof MySQLNonTransientConnectionException
                        || (e instanceof SQLException && e.toString().contains("Could not retrieve transation read-only status server"))) {
            // connect again        
            connect();
            // recursive, retry=false to avoid infinite loop
            return executeQuery(sql,false);
        }else{
            throw e;
        }
    }
    return resultSet;
}
I know, I'm using string to get the error.. need to do it better.. but it's a good start, and WORKS :-)
This will almost all reasons from a disconnect.