HikariCP准备语句空指针异常

时间:2015-03-30 18:18:44

标签: java hikaricp

我正在尝试实施Hikari Connection Pooling(v 2.3.5)。我有一切设置,我能够从池中检索连接,并设置一个preparedstatement对象。每当我尝试对准备好的声明进行任何操作时,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不为NULL。

1 个答案:

答案 0 :(得分:0)

为了简单起见,我在帖子中更改了这行代码:

PreparedStatement psClaims = con.prepareStatement(sql);

准备好的声明是由另一个将autoGeneratedKeys参数发送给驱动程序的类获得的:

con.prepareStatement(sql, PreparedStatement.NO_GENERATED_KEYS)

经过一些调试后,我发现驱动程序正在返回一个NULL预备语句,但HikariCP仍然返回了一个PreparedStatement代理对象。 HikariCP持有对从驱动程序获得的NULL preparedstatement的引用,并且每当准备好的语句被执行时抛出NPE,例如setString()。

我甚至不确定驱动程序返回NULL是否合法,我会倾向于它是驱动程序中的错误,所以我不确定它是否应该在HikariCP中解决。我将在那里提出一个问题,详细说明他们是否愿意检查这种情况。