执行业务抛出异常
Broken pipe, connection reset by peer
问题分析:网络故障,数据库连接超时。
处理方法:检查网络状态,修复网络故障,影响数据库连接超时的因素。例如,数据库参数session_timeout。
- 登录控制台单击指定集群名称。
- 在左侧导航栏选择“参数修改”,搜索参数“session_timeout”查看超时时间参数。
- 将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()。