c# - 以存储库模式和工作单元批量插入数据库,性能最佳
问题描述
我想在我的存储库中插入 800k 行,然后提交。我将每 15k 条记录发送到存储库并提交它,但它太慢了。
foreach (var imei in command.IMEIItems) {
var newIMEI = new IMEI(imei.IMEINumber, command.PromotionId);
_imeiRepository.Add(newIMEI);
}
_unitOfWork.Commit();
我的问题是关于 foreach 循环。添加到存储库中太慢了。提交很快。
我的存储库:
public virtual TEntity Add(TEntity entity)
{
if (entity != null)
{
TEntity addedTEntity = ObjectSet.Add(entity); // add new item in this set
return addedTEntity;
}
else
{
throw new ArgumentNullException();
}
}
protected virtual IDbSet<TEntity> ObjectSet
{
get
{
return _unitOfWork.CreateSet<TEntity>();
}
}
public virtual IDbSet<TEntity> CreateSet<TEntity>() where TEntity :
class
{
return base.Set<TEntity>();
}
解决方案
一个建议,假设您的 Repo 方法是线程安全的 -
Parallel.for
考虑到您的大数据量,您可以尝试使用。像这样的东西
但是,如果您的数据大小相对较小,则Parallel.For
考虑到 CPU 上下文切换开销,a 可能效率较低。
因此,可能值得检查输入集合的大小,然后在普通 for 和并行 for 之间做出决定,
推荐阅读
- javascript - 在数据表中呈现嵌套行的最佳方法是什么?
- python - Python DB2 - 找不到符号
- reactjs - 如何检测区域并在 Material UI 中使用正确的小数位分隔符?
- node.js - 如何为 phabricator 通知正确配置 Web 服务器(或 wss?)(或 ssl?)?
- php - 仅当数组元素中存在某个键时才复合数组
- python - 尝试从 Keras 运行顺序模型时出现 ValueError
- python - 如何编辑 Python 代码以循环请求以从列表中提取信息
- utf-8 - PIL 'utf-8' 编解码器无法解码位置 0 中的字节 0x89:无效的起始字节
- android - Android ConstraintLayout ConstraintLayout.LayoutParams.WRAP_CONTENT 不起作用
- spring-boot - 为 Spring Boot 应用程序使用多个数据源配置时,未从属性转换器内的属性获取值