使用实体框架的Azure流程大文件上的ASP.NET MVC - 数据库连接超时问题

问题描述 投票:0回答:3

我们有一个部署在Azure上的ASP.NET MVC应用程序。该应用程序允许用户上传大型Excel文件(大约15 MB = 25K行)。

在代码中,我们并行处理每个记录,对其执行验证,如果一切正常,我们使用Entity Framework在单个事务中将记录插入/更新到SQL Server数据库中。一段时间后,我们得到SQL Server数据库连接超时错误。

在没有在Azure上出现超时错误的情况下,以有效的方式处理这个大型Excel文件的最佳方法是什么?

谢谢

asp.net-mvc file-upload azure-sql-database azure-web-sites connection-timeout
3个回答
0
投票

不要将文件保存在数据库中。更好的方法是将其保存在文件系统或azure blob存储上,只需保存路径即可。是数据库保存文件或二进制数据的开销。


0
投票

使用实体框架SaveChanges增加超时。如果您开始出现内存不足错误,那么我的建议是使用ZZZProjects的BulkSaveChanges。使用BulkSaveChanges,您可以更快地上传文件并避免超时。


0
投票

这是我已经实施的解决方案。

  1. 将大型Excel文件上传到Web服务器。
  2. 解析Excel文件
  3. 对数据执行验证
  4. 创建批量数据并将其发送到客户端(Web浏览器)以进行进一步处理。 public static IEnumerable> Partition(IEnumerable source,int size){var partition = new List(size); var counter = 0; if(source!= null){using(var enumerator = source?.GetEnumerator()){while(enumerator.MoveNext()){partition.Add(enumerator.Current);计数器++; if(counter%size == 0){yield return partition.ToList(); partition.Clear(); counter = 0; }} if (counter != 0) yield return partition; } } }
  5. 从客户端向每个批处理的Web服务器发送AJAX请求
  6. 使用实体框架将数据更新到数据库中,并禁用自动检测更改。 _context.Configuration.AutoDetectChangesEnabled = false;

使用这种方法,我能够快速上传大约32K记录的5 MB(excel文件)。

感谢大家的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.