我正在尝试实现Hikari连接池(v2.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驱动程序到一个专用的DB。我以前用过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));在调用psClaims时,setString不是空的。
发布于 2015-04-01 16:13:17
为了简单起见,我在文章中更改了这一行代码:
PreparedStatement psClaims = con.prepareStatement(sql);准备好的语句是由向驱动程序发送autoGeneratedKeys参数的另一个类获得的:
con.prepareStatement(sql, PreparedStatement.NO_GENERATED_KEYS)经过一些调试后,我发现驱动程序正在返回一个空前置语句,但是HikariCP仍然返回了一个preparedstatement代理对象。HikariCP保存了对从驱动程序获得的NULL预付语句的引用,并在对预付语句进行操作时抛出一个NPE,例如,setString()。
我甚至不确定驱动程序返回NULL是否合法,我倾向于它是驱动程序中的一个bug,所以我不确定是否应该在HikariCP中解决它。我会在那里提出一个问题和细节,看看他们是否愿意对这种情况进行检查。
https://stackoverflow.com/questions/29353363
复制相似问题