Oracle 19c下OracleBulkCopy的WriteToServer方法处理大量记录报错问题
Oracle 19c 迁移后 BulkCopy 内存损坏错误修复方案
报错信息:
Attempted to read or write protected memory. this is often an indication that memory is corrupt
该问题出现的核心差异是DDTek.Oracle属于托管驱动,内存完全由.NET运行时管控,而替换后的Oracle.DataAccess.dll是非托管ODP.NET驱动,底层直接调用Oracle客户端的非托管内存,在对接19c、处理超大批量数据时容易出现内存访问越界。
可按照以下优先级依次排查修复:
- 校验驱动与客户端匹配性:
Oracle.DataAccess.dll的大版本号必须和服务器/本地部署的Oracle 19c客户端大版本完全一致,32/64位架构要和.NET项目的编译目标架构完全匹配,禁止混用不同版本、不同架构的驱动与客户端。 - 调整批量提交阈值:不要一次性将260万条全量数据传入
WriteToServer()方法,设置OracleBulkCopy.BatchSize属性为2000~10000区间的数值,分批次提交数据,避免单次申请过大的非托管连续内存空间。参考代码如下:
using (OracleBulkCopy bulkCopy = new OracleBulkCopy(oracleConnection)) { bulkCopy.BatchSize = 5000; bulkCopy.DestinationTableName = "目标表名"; // 配置列映射 bulkCopy.ColumnMappings.Add("源列名", "目标列名"); bulkCopy.WriteToServer(dataTable); }
- 显式管控资源生命周期:每批数据提交完成后,立即调用
Dispose()释放OracleBulkCopy实例占用的非托管内存,不要复用同一个BulkCopy实例处理所有批次的数据。 - 替换为托管版ODP.NET驱动:如果上述调整仍未解决问题,直接将依赖从
Oracle.DataAccess.dll替换为官方托管版Oracle.ManagedDataAccess.dll,该驱动内存完全由.NET运行时管理,不会出现非托管内存访问越界问题,且BulkCopy相关API和原有调用逻辑完全兼容,无需修改业务代码即可直接替换。
内容的提问来源于stack exchange,提问作者Sushant Bagul
相关产品推荐
相关产品推荐

