【Druid最佳实践】Druid报An I/O error occurred while sending to the backend等相关问题总结

概述

Druid报An I/O error occurred while sending to the backend比较觉,下面将可能原因总结如下,然后再一一举例说明:

1、网络连通问题:网络不通

2、数据传输超时:网络太慢、数据量太大,导致超过了写入或查询的超时时间

3、超时时间配置太短(本文重点)

官方文档

Druid官方网址:https://github.com/alibaba/druid

DruidDataSource配置属性列表https://github.com/alibaba/druid/wiki/DruidDataSource配置属性列表

Postgresql 官方网址:PostgreSQL: The world's most advanced open source database

Postgresql jdbc url连接参数列表:Initializing the Driver | pgJDBC

本文重点聚焦参数:

Druid:

connectTimeout   新增的控制创建连接时的socket连接最大等待超时,单位是毫秒,默认0表示永远等待,工作原理是在创建连接时将该值设置到对应数据库驱动的属性信息中由其JDBC驱动进行控制
socketTimeout 新增的控制创建连接时的socket最大读超时,单位是毫秒,默认0表示永远等待,配置成10000则表示db操作如果在10秒内未返回应答,将抛出异常,工作原理是在创建连接时
error error.kind: org.postgresql.util.PS0LException message: An I/0 error occurred while sending to the backend. stack: org.postgresql.util.PsQLException: An I/0 error occurred while sending to the backend at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:335) at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441) at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365) at org.postgresql.jdbc.PgPreparedstatement.executeWithFlags$original$d7UrnXE](PgPrepared at org.postgresql.jdbc.PgPreparedStatement.executeWithflags$original$d7UrnXE]$accessor$8 at org.postgresql.jdbc.PgPreparedStatement$auxiliary$sRWuPpuQ.call(Unknown Source) at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.inte at org.postgresql.jdbc.PgPreparedstatement.executeWithFlags(PgPreparedstatement.java) at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:132) at com.alibaba,druid.filter,FilterChainImpl.preparedStatement execute(filterChainImpl.ia at com.alibaba.druid.filter,FilterEventAdapter.preparedStatement execute(filterEventAda! at com.alibaba.druid.filter.FilterChainImpl.preparedStatement execute(FilterChainImpl.ja at com.alibaba.druid.wall.WallFilter.preparedStatement execute(WallFilter.java:639) at com,alibaba,druid,filter,filterChainImpl,preparedStatement execute(FilterChainImpl.ja at com.alibaba.druid.filter,filterEventAdapter,preparedStatement execute(FilterEventAdar at com.alibaba.druid.filter.filterChainImpl.preparedstatement execute(FilterChainImpl.ja at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl,execute(PreparedStatementProx at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatem at sun.reflect.GeneratedMethodAccessor181.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl,invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.logging.jdbc.PreparedstatementLogger
03-08
当用户在使用 DBeaver 连接数据库时遇到 `org.jkiss.dbeaver.model.sql.DBSQLException: SQL error: An I/O error occurred while sending to the backend` 错误,通常表示客户端与数据库之间的网络通信中断或超时[^1]。 ### 可能的原因 1. **数据库连接未及时关闭** 如果应用在获取连接后未及时关闭(例如 `DriverManager.getConnection` 后未调用 `con.close()`),数据库可能会在一段时间后主动清除空闲连接。当客户端再次尝试使用该连接时,就会出现 I/O 错误。 2. **数据库侧主动终止连接** 数据库管理员可能通过 `pg_terminate_backend(pid)` 主动终止了连接,尤其是在数据库负载高、资源紧张或正在进行维护时。 3. **数据库节点重启** 如果数据库的 CN 节点(接收 SQL 请求的节点)在连接期间重启,也会导致连接中断。 4. **磁盘使用率过高导致只读状态** 如果数据库所在磁盘使用率超过 90%,数据库可能自动转为只读模式,从而影响连接和数据写入操作。 5. **Kettle 等工具使用不当** 若用户使用 Kettle 进行数据同步,采用表输入/输出方式会导致频繁的连接与断开,增加网络压力,容易触发 I/O 异常。推荐使用底层 `COPY` 语法进行批量导入,减少连接资源的消耗。 6. **连接超时机制** 数据库或网络设备可能配置了连接超时机制,长时间无活动的连接会被自动清除。 --- ### 解决方案 1. **检查连接管理逻辑** 确保在使用完数据库连接后,调用 `close()` 方法释放资源。避免连接泄漏,尤其是在使用连接池时,应确保连接归还池中而非直接关闭。 2. **优化数据导入方式** 若使用 Kettle,建议采用 `COPY` 命令进行数据导入,该方式仅建立一次连接,批量传输数据效率更高,资源消耗更低。 3. **数据库连接池配置** 使用连接池(如 HikariCP、Druid)时,配置合理的最大连接数、空闲超时时间及测试连接有效性策略,避免使用失效连接。 4. **数据库配置优化** 检查数据库的连接超时设置,适当延长空闲连接保持时间,或在数据库配置心跳机制,防止连接因空闲被清除。 5. **网络稳定性检查** 确保客户端与数据库之间的网络稳定,排查是否存在防火墙、负载均衡器或中间代理设备导致的连接中断问题。 6. **监控与日志分析** 查看数据库日志,确认是否有主动终止连接、节点重启或磁盘空间不足的记录,帮助定位问题根源。 --- ### 示例:使用 COPY 命令进行高效数据导入(PostgreSQL/GaussDB) ```sql COPY target_table FROM '/path/to/data.csv' DELIMITER ',' CSV HEADER; ``` 该命令一次性导入大量数据,无需频繁建立连接,适用于大数据量场景。 --- ### 示例:DBeaver 中配置连接池(HikariCP) 在 DBeaver 的连接设置中,启用连接池配置如下参数: - **Maximum Pool Size**: 10 - **Idle Timeout**: 600000 (10分钟) - **Validation Timeout**: 3000 - **Connection Test Query**: `SELECT 1` 确保连接池能有效管理连接生命周期,避免无效连接被复用。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞火流星02027

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值