如何高效分块读写.NET中的Oracle BLOB大对象?
- 内容介绍
- 文章标签
- 相关推荐
本文共计807个文字,预计阅读时间需要4分钟。
相关专题:
Oracle BLOB太大,直接GetBytes()抛OutOfMemoryException怎么办
oracle的blob字段存gb级文件时,.net的oraclecommand.executescalar()或oracledatareader.getbytes()会尝试一次性加载全部字节到内存,极易触发outofmemoryexception。这不是连接问题,是设计使然——getbytes()底层仍走内存缓冲。
必须改用流式分块读写,绕过内存峰值。核心是:不用byte[]承载全文,改用Stream逐段搬运。
- 读取时,调用
OracleBlob.GetStream()获取可读流(注意:需保持OracleConnection打开) - 写入时,先插入空BLOB(
EMPTY_BLOB()),再用OracleBlob.SetStream()写入 - 务必手动控制
Buffer大小,推荐8192~65536字节;太小IO频繁,太大仍占内存
用OracleBlob.GetStream()读BLOB时连接被意外关闭
OracleBlob.GetStream()返回的流强依赖底层OracleConnection状态。
本文共计807个文字,预计阅读时间需要4分钟。
相关专题:
Oracle BLOB太大,直接GetBytes()抛OutOfMemoryException怎么办
oracle的blob字段存gb级文件时,.net的oraclecommand.executescalar()或oracledatareader.getbytes()会尝试一次性加载全部字节到内存,极易触发outofmemoryexception。这不是连接问题,是设计使然——getbytes()底层仍走内存缓冲。
必须改用流式分块读写,绕过内存峰值。核心是:不用byte[]承载全文,改用Stream逐段搬运。
- 读取时,调用
OracleBlob.GetStream()获取可读流(注意:需保持OracleConnection打开) - 写入时,先插入空BLOB(
EMPTY_BLOB()),再用OracleBlob.SetStream()写入 - 务必手动控制
Buffer大小,推荐8192~65536字节;太小IO频繁,太大仍占内存
用OracleBlob.GetStream()读BLOB时连接被意外关闭
OracleBlob.GetStream()返回的流强依赖底层OracleConnection状态。

