如何通过JDBC写入BLOB文件_setBinaryStream上传图片与大文件至数据库

PreparedStatement.setBinaryStream写不进数据库的主因是流被提前关闭或未触发实际写入,MySQL需配置useServerPrepStmts=true并传精确长度,PostgreSQL要求事务内操作且字段为bytea,Oracle不支持带长度参数的重载。PreparedStatement.setBinaryStream 为什么写不进数据库?常见现象是执行完 executeupdate() 没报错,但查数据库发现 blob 字段为 null 或空字节。根本原因不是 api 用错了,而是流被提前关闭或未触发实际写入。必须确保传入的 InputStream 在 executeUpdate() 调用前仍处于可读状态(比如文件没被 close,网络流没超时)MySQL 驱动默认把大对象当"客户端临时数据"处理,如果连接配置没开 useServerPrepStmts=true,setBinaryStream 可能被降级成 setBytes,悄悄把整个流加载进内存再转 byte\[\] ------ 大文件直接 OOMPostgreSQL 的 setBinaryStream 要求字段类型明确是 bytea,且不能在事务外调用(否则抛 PGSQLException: Large Objects may not be used outside a transaction)MySQL 和 PostgreSQL 的 setBinaryStream 参数差异两个主流驱动对第二个参数(长度)的处理逻辑完全不同,填错就静默失败。MySQL(Connector/J 8.0+):第二个参数是「精确字节数」,必须传真实长度;传 -1 会回退到 setBytes,传 0 直接写空 blobPostgreSQL(pgjdbc 42.6+):第二个参数是「最大预期长度」,可以略大于实际值(如传 10 * 1024 * 1024 写 5MB 图片),但不能为 0 或负数;传 -1 会抛异常Oracle(ojdbc8):不支持 setBinaryStream(int, InputStream, long) 重载,只能用 setBinaryStream(int, InputStream)(无长度参数),靠流 EOF 判断结束示例(MySQL 安全写法):File file = new File("/tmp/photo.jpg");try (FileInputStream fis = new FileInputStream(file)) { ps.setBinaryStream(1, fis, file.length()); // 必须是 file.length() ps.executeUpdate();}上传大文件时连接和事务怎么配才不崩BLOB 写入本质是长耗时 I/O,不调优的话,要么连不上,要么事务超时,要么驱动自己 abort。MySQL 连接串加 maxAllowedPacket=256M&connectTimeout=30000&socketTimeout=600000,否则 16MB 以上文件直接被服务端拒收PostgreSQL 必须显式开启事务:conn.setAutoCommit(false);ps = conn.prepareStatement("INSERT INTO docs(name, content) VALUES (?, ?)");ps.setBinaryStream(2, fis, fileSize);ps.executeUpdate();conn.commit(); // 不 commit,LOB 资源不释放别在 Spring @Transactional 方法里直接传 request.getInputStream() ------ HTTP 请求流只读一次,第二次调用 setBinaryStream 会读到空流为什么图片存进去了却打不开?不是编码问题,是内容被意外截断或污染。最常踩的三个坑: JoinMC智能客服 JoinMC智能客服,帮您熬夜加班,7X24小时全天候智能回复用户消息,自动维护媒体主页,全平台渠道集成管理,电商物流平台一键绑定,让您出海轻松无忧!

相关推荐
Techblog of HaoWANG8 分钟前
Ubuntu 下将 Ollama 服务配置为监听 0.0.0.0:11434 完整实践
linux·数据库·ubuntu·ollama
MoRanzhi120311 分钟前
第4篇 · 使用 PyQt5 实现 2048:平滑动画与性能优化
python·性能优化·qtimer·pyqt5·qpainter·gui动画·2048游戏
似水流年QC13 分钟前
LangChain 入门与实战
服务器·数据库·langchain
周厉18 分钟前
酒店PMS系统设计:房型房价管理与动态价格优先级实现(Java/MySQL)
java·数据库·pms酒店系统
howard200518 分钟前
任务 2-3 图形化管理工具Navicat
数据库·mysql·navicat
一碗白开水一24 分钟前
Day 5 · 弹性 | 微观
java·前端·数据库
迪飞特科技24 分钟前
大模型接入业务系统:API、本地部署、RAG、智能体四种路线怎么选
java·数据库·人工智能·知识图谱·deepseek·本地化大模型
星轨zb27 分钟前
[专题5]支付发放物品的一致性保障:事务、幂等与状态流转
数据库·后端·mongodb·支付架构学习
海姐软件测试31 分钟前
Python 自动化与 AI 结合:基于 Jenkins 的回归验证实践
人工智能·python·自动化