JDBI和PGJDBC-NG Postgres驱动程序出现“ SQLException:展开错误”

时间:2019-06-13 20:34:37

标签: java postgresql jdbc jdbi pgjdbc-ng

我正在使用JDBI连接到我的Postgres数据库。这一直很好。今天,我决定尝试用PGJDBC-NG驱动程序替换本机Postgres驱动程序。一切正常,直到我尝试第一个简单查询:

jdbi.useExtension(FooDao.class, dao -> {
    dao.insert(e);
});

不幸的是,这导致:

  

org.jdbi.v3.core.ConnectionException:java.sql.SQLException:展开错误

调试到应用程序中,我发现JDBI的customizeHandle类的PostgresPlugin方法中发生了异常:

@Override
public Handle customizeHandle(Handle handle) {
    PGConnection pgConnection = Unchecked.supplier(() -> handle.getConnection().unwrap(PGConnection.class)).get();
    return handle.configure(PostgresTypes.class, pt -> pt.addTypesToConnection(pgConnection));
}

unwrap方法的第一行中引发了异常。似乎存在的问题是,对于新驱动程序,getConnection返回一个PGDirectConnection的实例,该实例不能从PGConnection进行分配,这是unwrap方法调用指定的。

是否有解决方法?我想我可以扩展PostgresPlugin并覆盖customizeHandle的实现以使用PGDirectConnection进行包装,但我不希望这样做。

编辑:抱歉,由于customizeHandle不公开,因此无法覆盖PostgresTypes.addTypesToConnection

1 个答案:

答案 0 :(得分:1)

PostgresPlugin JDBI正在直接查询PGConnection;这是仅在标准驱动程序中可用的类。因此,直到将其更改为可与NG一起使用为止,它才会生效。

尽管如此,根据文档...

  

该插件为Java 8 java.time类型(如Instant或Duration,InetAddress,UUID,键入的枚举和hstore)配置映射。

但这不是必需的,因为PGJDBC-NG本机支持所有这些类型!

解决方案

请勿使用PostgresPlugin