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 中解决.我会在那里提出一个问题的细节,看看他们是否愿意检查这种情况。
我正在尝试实施 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 中解决.我会在那里提出一个问题的细节,看看他们是否愿意检查这种情况。