基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
Java 程序使用 OceanBase Connector/J 驱动连接 OceanBase 数据库时被远端断开
更新时间:2023-11-14 02:10
问题现象
Java 程序使用 OceanBase Connector/J 驱动连接 OceanBase 数据库时,发生报错:unexpected end of stream, read 0 bytes from 4 (socket was closed by server).
问题原因
当客户端程序执行完 SQL 语句,在等待数据库服务器返回数据的过程中,如果连接突然被远端断开,Java 程序就会抛出该错误。
影响的版本
- OceanBase 数据库 V3.2.x
- OceanBase 数据库 V4.x.x
解决方法及规避方式
一般的,出现该异常的原因可能是后端 ODP、OBServer 节点断链,也可能是负载均衡设备断链, 或者是传输链路本身的异常(例如网络故障、机房故障等物理设备异常)。
在访问链路异常出现时,通常的分析方法是,首先分析 ODP 的 digest 日志和线程日志,如果对应的线程日志在程序异常时间点出现 VC_EVENT_INACTIVITY_TIMEOUT、handle_server_connection_break日志,则可以断定该异常是由于 ODP 断开连接所导致;否则需要通过 ODP 日志做进一步的分析,查看执行 SQL 的 OceanBase 数据库的主机状况,即查看 OceanBase 数据库主机的 observer.log 日志,确认 OBServer 节点是否执行超时或者出现其他异常状况。
如果该异常问题可以复现,可以考虑在访问链路的 ODP 与 OBServer 节点进行抓包,进一步明确原因,例如查看是否涉及负载均衡设备断链或者是传输链路本身的异常(例如网络故障、机房故障等物理设备异常)等。