Oracle数据库存储PDF报错:数据大小超类型最大值求解决方案
Data size bigger than max size错误 嘿,这个问题我之前也踩过坑,刚好能帮到你!你碰到的java.sql.SQLException: Data size bigger than max size for this type: 71365错误,核心原因其实很明确——要么是数据库字段类型不够大,要么是老版本JDBC驱动的处理限制,咱们一步步来解决:
1. 先检查数据库表的字段类型
你能存30KB以内的文件,超过就报错,这刚好对应Oracle里LONG RAW类型的最大限制(32767字节,约32KB)。所以首先要确认你存储文件的字段是不是用了LONG RAW,如果是,赶紧改成BLOB类型——BLOB最大能存4GB,完全满足大文件的需求。
修改字段的SQL语句如下:
ALTER TABLE your_table_name MODIFY your_file_column BLOB;
(记得把your_table_name和your_file_column替换成你实际的表名和字段名)
2. 优化JDBC代码的BLOB写入方式
你当前用的setBinaryStream方法在老版本ojdbc14里,对大文件的支持可能有局限。建议换成setBlob方法,手动创建Blob对象并写入数据,这样更稳定:
InputStream FILE_CONTENT = null; Part filePart = req.getPart("pdf_file"); if (filePart != null ) { // 保留调试信息 logger.info("File Name::"+filePart.getName()); logger.info("File Size::"+filePart.getSize()); logger.info("File Type::"+filePart.getContentType()); InputStream inputStream = filePart.getInputStream(); // 创建Blob对象 Blob blob = connection.createBlob(); OutputStream blobOutputStream = blob.setBinaryStream(1); // 用缓冲区读写数据,避免内存溢出 byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { blobOutputStream.write(buffer, 0, bytesRead); } // 关闭流,释放资源 blobOutputStream.close(); inputStream.close(); // 设置Blob参数到PreparedStatement cs.setBlob(1, blob); }
3. 考虑升级JDBC驱动版本
ojdbc14是适配JDK1.4的老驱动了,对大BLOB的处理存在一些已知的限制和bug。如果你的项目环境允许,建议升级到更高版本的ojdbc,比如ojdbc6(适配JDK6)或者ojdbc8(适配JDK8+),新驱动对大对象的支持更完善,能避免很多奇怪的问题。
4. 调整JDBC连接的LOB预取参数
如果升级驱动暂时做不到,可以试试在JDBC连接URL里添加defaultLobPrefetchSize参数,设置一个较大的值,比如1MB:
jdbc:oracle:thin:@//your_db_host:1521/your_service_name?defaultLobPrefetchSize=1048576
这个参数能调整驱动预取LOB数据的大小,避免因预取限制导致的写入失败。
按照这几步来,应该就能解决大PDF存储的问题了!
内容的提问来源于stack exchange,提问作者Tell Me How

