PostgreSQL抛错“不良的类型值: long”之解决

原创 Laughing  2019-11-23 10:14  阅读 41 次 评论 0 条

前言

项目中有一个独立程序,负责从主库同步部分数据到分库。由于混合使用了JPA和JDBC两种操作方式,该程序移植到后PostgreSQL错误不断且不好诊断,其中耗时耗力最多的就是:“org.postgresql.util.PSQLException: 不良的类型值 long ”。

解决方法

org.hibernate.dialect.PostgreSQLxxDialect,经一层层追溯,终于在最底层的PostgreSQL81Dialect(藏的太深了),在getSqlTypeDescriptorOverride()接口中找到对应的内容,而且发现默认的oid + bigobject方式是在此定义的。于是重写该接口:

  1. @Override  
  2.     public SqlTypeDescriptor getSqlTypeDescriptorOverride(int sqlCode)  
  3.     {  
  4.         SqlTypeDescriptor descriptor;  
  5.         switch (sqlCode)  
  6.         {  
  7.         case Types.BLOB:  
  8.             // Force BLOB binding. Otherwise, byte[] fields annotated  
  9.             // with @Lob will attempt to use  
  10.             // BlobTypeDescriptor.PRIMITIVE_ARRAY_BINDING. Since the  
  11.             // dialect uses oid for Blobs, byte arrays cannot be used.  
  12.             //descriptor = BlobTypeDescriptor.BLOB_BINDING;  
  13.             descriptor = BlobTypeDescriptor.STREAM_BINDING;  
  14.             break;  
  15.         case Types.CLOB:  
  16.             //descriptor = ClobTypeDescriptor.CLOB_BINDING;  
  17.             descriptor = ClobTypeDescriptor.STREAM_BINDING;  
  18.             break;  
  19.         default:  
  20.             descriptor = super.getSqlTypeDescriptorOverride(sqlCode);  
  21.             break;  
  22.         }  
  23.         return descriptor;  
  24.     }  
温馨提示
      推荐使用二进制数组方式存取LOB,而不是默认的oid + bigobject;
      如果抛错信息“不良的类型值”后是long,几乎可断定是LOB调用模式的问题;如果是其它类型,需进一步分析。
      如果直接用JDBC,对LOB的调用接口是setBinaryStream()、setCharacterStream()等。

历史上的今天:

本文地址:https://www.lisen.me/postgresql-throw-type-long-resolution.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!
NEXT:已经是最新一篇了

发表评论


表情