java jdbc处理大文本和二进制数据需用流式操作避免oom;mysql以text/blob替代clob/blob,通过setcharacterstream/getcharacterstream和setbinarystream/getbinarystream安全读写。

Java JDBC 处理大文本(如文章、日志)和二进制数据(如图片、PDF、音频)的核心是使用 流式操作,避免一次性加载全部内容到内存,防止 OOM。MySQL 不支持标准 CLOB/BLOB 接口语义,而是用 TEXT 和 BLOB 类型替代,JDBC 通过 setCharacterStream/getCharacterStream(文本)与 setBinaryStream/getBinaryStream(二进制)来安全读写。
选对 MySQL 字段类型
根据数据大小选择合适类型,避免截断或性能浪费:
-
大文本(如用户协议、长评论):优先用
MEDIUMTEXT(最大约 16MB)或LONGTEXT(最大约 4GB) -
二进制文件(如头像、附件):对应用
MEDIUMBLOB或LONGBLOB - 不要用
TEXT存超过 64KB 的内容,否则可能被截断;也不要为 10KB 图片用LONGBLOB,徒增存储开销
写入大文本:用 FileReader + setCharacterStream
不把整个文件读成 String,而是以字符流方式写入:
- 准备
FileReader,长度参数必须是int(所以文件不能超过 2GB) - 调用
pstmt.setCharacterStream(1, reader, (int) file.length()) - 执行前确保数据库连接未启用 auto-commit(尤其大数据量时),必要时手动 commit
- 示例 SQL:
INSERT INTO doc (title, content) VALUES (?, ?),其中content是LONGTEXT
读取大文本:用 getCharacterStream 或 getString
两种方式适用不同场景:
-
rs.getCharacterStream("content")→ 返回Reader,适合边读边处理(如逐行解析、分块写入文件) -
rs.getString("content")→ 直接返回完整字符串,仅适用于确定内容较小( - 读完后务必关闭
Reader,否则连接资源可能泄漏
处理二进制数据:用 InputStream + setBinaryStream
原理同文本,但换用字节流:
- 写入时:
pstmt.setBinaryStream(1, new FileInputStream(file), (int) file.length()) - 读取时:
InputStream is = rs.getBinaryStream("img"),再用Files.copy(is, Paths.get("out.jpg"))保存 - 注意:MySQL 驱动默认限制
maxAllowedPacket(通常 4MB),若存大文件需在 URL 中显式加大,例如:jdbc:mysql://localhost:3306/test?maxAllowedPacket=67108864(64MB)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











