首页 > 解决方案 > 使用 JDBI 和 PGJDBC-NG Postgres 驱动程序的“SQLException:解包错误”

问题描述

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

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

不幸的是,这导致:

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

调试到应用程序我发现异常发生在customizeHandleJDBIPostgresPlugin类的方法中:

@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和覆盖customizeHandleto unwrap using的实现,PGDirectConnection但如果可能的话,我不希望这样做。

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

标签: javapostgresqljdbcjdbipgjdbc-ng

解决方案


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

虽然,根据文档...

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

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

解决方案

不要使用PostgresPlugin


推荐阅读