更新时间:2024-11-01 GMT+08:00
分享

执行业务抛出异常

Broken pipe, connection reset by peer

问题分析:网络故障,数据库连接超时。

处理方法:检查网络状态,修复网络故障,影响数据库连接超时的因素。例如,数据库参数session_timeout。

  1. 登录控制台单击指定集群名称。
  2. 在左侧导航栏选择“参数修改”,搜索参数“session_timeout”查看超时时间参数。
  3. 将session_timeout的CN、DN参数值设置为0,详情可参见修改数据库参数

The column index is out of range

问题分析:应用程序获取的结果集和预期不一致,列数不一致。

处理方法:检查数据库表定义和查询SQL,对返回结果集做一个正确预期。例如结果集只有3列,取值时传入的index最大为3。

SQL包含大量参数导致报错:Tried to send an out-of-range integer as a 2-byte value

问题分析:JDBC协议规定,变量总数不能超过32767,short Int最大值。

处理方法

数据查询:建议将大SQL进行拆分,确保每个SQL变量数小于32767。

数据导入:建议分批导入或使用copymanager,参考CopyManager

调用存储过程报错 ERROR: cached plan must not change result type

问题分析:由于JDBC中使用了PreparedStatement,默认重复执行5次就会缓存plan,在此之后有如果重建表操作(例如修改表定义),再次执行就会报错ERROR: cached plan must not change result type.

处理方法:在JDBC连接字串中指定prepareThreshold=0,不再cache plan。例如:

1
String url = "jdbc:postgresql:// 192.168.0.10:2000/postgres?prepareThreshold=0";

使用JDBC执行sql语句报错 ERROR: insufficient data left in message

问题分析:服务端无法处理字符串中的'\0'字符,'\0'即数值0x00、UTF编码'\u0000'的字符串。

处理方法:排查客户执行的SQL中是否包含'\0'字符,去掉特殊字符,可用空格代替。

使用JDBC执行create table as语句报错 ERROR: relation "xx" already exists

问题分析:JDBC调用preparedStatement.getParameterMetaData()时会发送P报文,该报文会在数据库中创建表,导致execute执行时报表已存在。

处理方法:使用preparedStatement时,建议将CREATE TABLE AS拆开执行或者使用resultSet.getMetaData()。

相关文档