import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;

import com.mysql.jdbc.Driver;

public class Reproduce41484 {

    private static final String TABLE_NAME = "your_table";
    private static final String CATALOG_NAME = "your_catalog";
    private static final String DB_USERNAME = "username";
    private static final String DB_PASSWD = "pass"; 
    private static final String DB_URI = "jdbc:mysql://127.0.0.1/db?cacheResultSetMetadata=true";

    private void testReproduce41484() throws SQLException {
        BasicDataSource ds = new BasicDataSource();
        ds.setUrl(DB_URI);
        ds.setUsername(DB_USERNAME);
        ds.setPassword(DB_PASSWD);
        ds.setDriverClassName(Driver.class.getCanonicalName());
        
        ds.setAccessToUnderlyingConnectionAllowed(true);
        Connection c = ds.getConnection();
        
        DatabaseMetaData meta = c.getMetaData();
        ResultSet tables = meta.getTables(CATALOG_NAME, null, TABLE_NAME, null);
        while(tables.next()) {
            String tableName = tables.getString("TABLE_NAME");
            meta.getColumns(null, null, tableName, "%");
        }
    }

    public static void main(String[] args) {
        try {
            new Reproduce41484().testReproduce41484();
        } catch(Throwable t) {
            t.printStackTrace();
        }
    }

}
