Postgresql (pg) 精准类型sql异常难定位问题

Postgresql (pg) 精准类型sql异常难定位问题

----- 解决时间:2021-10-23号

【已解决】pg对相关sql查询和入参的参数类型必须一致的问题,可以通过配置pg连接的相关参数解决,例如如下jdbcUrl示例


jdbc:postgresql://192.168.1.101:5432/pg_test?currentSchema=public&reWriteBatchedInserts=true&TimeZone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&stringtype=unspecified


---------以下为未配置 stringtype=unspecified 参数导致的参数未格式化相关的异常提示 -------

--------- 2021-10-23 号之前发生的参数未格式化相关的异常事件处理方式--------------------

这里简单执行一句sql:

String sql = "select * from cr_vehicle_type " +
        "where VEHICLE_TYPE_ID in(?,200) " +
        " and create_time > ? ";
//  create_time 是时间类型,但是故意输入字符串,pg会报错,mysql是不会的,所以这里拿出来特别说明下
EDb.use("pg").find(VehicleType.class,sql,100, "2020-01-08")

然后抛出一串异常 

```

com.jfinal.plugin.activerecord.ActiveRecordException: java.lang.RuntimeException: org.postgresql.util.PSQLException: ERROR: operator does not exist: timestamp without time zone > character varying

  建议:No operator matches the given name and argument types. You might need to add explicit type casts.

  位置:81


at com.edbplus.db.EDbPro.find(EDbPro.java:1144)

```

关键点是   位置:81 附近出现sql类型错误,但是没打印出来,咱们还得还原sql,难度是比较高的

所以,建议可以在 druid 的底层逻辑实现,或者 jfinal Db的底层实现判断拦截,将上下游的sql范围信息打印出来,例如通过druid监听实现异常信息反向解析

image.png



评论区

zhangtianxiao

2021-10-08 10:07

那你倒是做

小佳

2021-10-13 11:37

@zhangtianxiao 我自己已经实现了,我的实现原理是基于druid的sql监听,但是jfinal底层的sql异常捕获那里,可以进行二次解析翻译,解决sql异常告知能力的不足,所以我只能通过这种方式告知解决方案,详细的代码,在我自己的另外一篇博客里有写

热门分享

扫码入社