【问题标题】:"SQLException: Unwrap error" with JDBI and PGJDBC-NG Postgres Driver使用 JDBI 和 PGJDBC-NG Postgres 驱动程序的“SQLException:解包错误”
【发布时间】:2019-10-28 12:05:50
【问题描述】:

我正在使用 JDBI 连接到我的 Postgres 数据库。这一直运作良好。今天我决定尝试用PGJDBC-NG驱动替换原生的Postgres驱动。一切都很好,直到我尝试我的第一个简单查询:

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

不幸的是,这会导致:

org.jdbi.v3.core.ConnectionException: java.sql.SQLException: 解包错误

调试应用我发现异常发生在JDBI的PostgresPlugin类的customizeHandle方法中:

@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 的实例,正如 unwrap 方法调用所指定的那样,它不能从 PGConnection 分配。

有解决办法吗?我想我可以扩展 PostgresPlugin 并覆盖 customizeHandle 的实现以使用 PGDirectConnection 展开,但如果可能的话我不想这样做。

编辑:呃,不能覆盖customizeHandle,因为PostgresTypes.addTypesToConnection 不公开。

【问题讨论】:

    标签: java postgresql jdbc jdbi pgjdbc-ng


    【解决方案1】:

    PostgresPlugin JDBI 直接查询PGConnection;这是仅在标准驱动程序中可用的类。因此,除非它被更改为与 NG 一起使用,否则它不会。

    虽然,根据文档...

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

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

    解决方案

    不要使用PostgresPlugin

    【讨论】:

      猜你喜欢
      • 2020-10-27
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2014-02-05
      • 2013-03-16
      • 2018-11-16
      相关资源
      最近更新 更多