HikariCP 准备语句空指针异常

HikariCP Prepared Statement Null Pointer Exception

我正在尝试实施 Hikari 连接池 (v 2.3.5)。我已设置好所有内容,并且能够从池中检索连接,并设置一个准备好的语句对象。每当我尝试对准备好的语句执行任何操作时,Hikari 都会抛出一个内部 NPE。

Data Warehouse Task Error
com.hs.task.warehouse.eci.EciConversionException: Failed while converting claims...
    at com.hs.task.warehouse.eci.Claims.convertTable(Claims.java:253)
    at com.hs.task.warehouse.DataWarehouseTask.execute(DataWarehouseTask.java:76)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.NullPointerException
    at com.zaxxer.hikari.proxy.PreparedStatementJavassistProxy.setString(PreparedStatementJavassistProxy.java)
    at com.hs.task.warehouse.eci.Claims.convertTable(Claims.java:68)
    ... 3 more

我正在使用非常旧的 JDBC 专有数据库驱动程序。我以前使用 Proxool 和这个相同的驱动程序没有问题。

配置:

HikariConfig hconf = new HikariConfig();
                hconf.setDriverClassName("com.dbcswc.fs.jdbc.Driver");
                hconf.setJdbcUrl("=jdbc:fs3:MyServer:9584/MyDB;encryption=off;localport=0");
                hconf.setUsername("user");
                hconf.setPassword("pass");
                hconf.setConnectionTestQuery("select 1 as test from pu");

这是错误发生的地方

PreparedStatement psClaims = con.prepareStatement(sql);
psClaims.setString(1, ECI_DT_FMT.format(lastConvertDate));

此时调用 setString 时 psClaims 为 NOT NULL。

为了简单起见,我把post中的这行代码改成了:

PreparedStatement psClaims = con.prepareStatement(sql);

准备好的语句正在被另一个 class 获取,它正在向驱动程序发送 autoGeneratedKeys 参数:

con.prepareStatement(sql, PreparedStatement.NO_GENERATED_KEYS)

经过一些调试,我发现驱动程序正在 return 一个 NULL preparedstatement,但是 HikariCP 仍然 returned 一个 PreparedStatement 代理对象。 HikariCP 持有从驱动程序获得的 NULL preparedstatement 的引用,并在 preparedstatement 被执行时抛出 NPE,例如 setString()。

我什至不确定驱动程序 return NULL 是否合法,我认为它是驱动程序中的一个错误,所以我不确定它是否应该在 HikariCP 中解决.我会在那里提出一个问题的细节,看看他们是否愿意检查这种情况。