我正在使用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
。
答案 0 :(得分:1)
PostgresPlugin
JDBI正在直接查询PGConnection
;这是仅在标准驱动程序中可用的类。因此,直到将其更改为可与NG一起使用为止,它才会生效。
尽管如此,根据文档...
该插件为Java 8 java.time类型(如Instant或Duration,InetAddress,UUID,键入的枚举和hstore)配置映射。
但这不是必需的,因为PGJDBC-NG
本机支持所有这些类型!
请勿使用PostgresPlugin