我试图在java应用程序中使用HikariCP来实现到MySQL的连接池。
由于DB设计缺陷,应用程序使用不同的数据库,需要时我必须显式调用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)...
不用说,我检查了目录是否为null:
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的问题吗?有没有办法关闭连接并将其发送回池?
发布于 2015-09-05 02:30:29
由于@brettw,要解决这个问题,您必须在HikariCP属性中设置默认目录:
HikariConfig conf = new HikariConfig();
....
conf.setCatalog(DatabaseConfiguration.JDBC_DEFAULT_DATABASE);
ds = new HikariDataSource(conf);
https://stackoverflow.com/questions/32377477
复制相似问题