HikeriCP:java.sql.SQLException:关闭具有显式目录的连接时,Catalog不能为null

时间:2015-09-03 13:47:39

标签: java mysql jdbc connection-pooling hikaricp

我试图在Java应用程序中使用HikariCP来实现与MySQL的连接池。

由于数据库设计缺陷,应用程序使用不同的数据库,我必须在需要时显式调用connection.setCatalog()来更改数据库。

当我尝试关闭使用默认数据库的连接时(没有调用setCatalog()),一切正常,连接返回池。但如果这是与另一个数据库的连接(使用setCatalog()),当我调用close()方法时,我得到以下异常:

java.sql.SQLException: Catalog can not be null
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1074)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
    at com.mysql.jdbc.ConnectionImpl.setCatalog(ConnectionImpl.java:5324)
    at com.zaxxer.hikari.pool.PoolElf.resetConnectionState(PoolElf.java:263)
    at com.zaxxer.hikari.pool.PoolBagEntry.resetConnectionState(PoolBagEntry.java:122)
    at com.zaxxer.hikari.proxy.ConnectionProxy.close(ConnectionProxy.java:193)
    at someapp.repository.MySqlRepository.closeConnection(MySqlRepository.java:198)...

毋庸置疑,我已检查目录是否为空:

public void closeConnection() throws SQLException{
        System.out.println("trying to close with catalog:"+connection.getCatalog());

        if(connection!=null){

        //connection.setCatalog("defaultdb");
            connection.close();

        }
        this.connection=null;
    }

如果我取消注释connection.setCatalog("defaultdb")以将目录设置回默认值,则问题仍然存在。

一切都很好的唯一情况是我根本不使用setCatalog()方法。

当目录明确设置时,这是hikaricp的问题吗?有没有办法关闭连接并将其发送回池?

1 个答案:

答案 0 :(得分:1)

感谢@brettw,要解决此问题,您必须在HikariCP属性中设置默认目录:

    HikariConfig conf = new HikariConfig();

    ....

    conf.setCatalog(DatabaseConfiguration.JDBC_DEFAULT_DATABASE);

    ds = new HikariDataSource(conf);