private Statement generateStatement(final String sql, final String dataSourceName)
     throws SQLException {
   HashCode hashCode =
       Hashing.md5()
           .newHasher()
           .putString(sql, Charsets.UTF_8)
           .putString(dataSourceName, Charsets.UTF_8)
           .hash();
   if (cachedRoutedStatements.containsKey(hashCode)) {
     return cachedRoutedStatements.get(hashCode);
   }
   Connection connection = shardingConnection.getConnection(dataSourceName);
   Statement result;
   if (0 == resultSetHoldability) {
     result = connection.createStatement(resultSetType, resultSetConcurrency);
   } else {
     result =
         connection.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
   }
   replayMethodsInvocation(result);
   cachedRoutedStatements.put(hashCode, result);
   return result;
 }