【问题标题】:How to Cache SpreadSheetGear objects in ASP.NET MVC application?如何在 ASP.NET MVC 应用程序中缓存 SpreadSheetGear 对象?
【发布时间】:2017-08-26 23:43:05
【问题描述】:

在 ASP.NET MVC 应用程序中,我正在执行 xlsx 文件中的计算。我们在计算中讨论 18K 变量(xlsx 文件大约 10MB),因此将它们加载到 SpreadSheetGear 实例中需要一段时间。因此,我需要在请求之间缓存 SpreadSheetGear 对象,否则每个请求都将持续很久。

现在我正在使用 In-Proc Application Cache 和 Session Cache 来保存请求之间的数据。在我的测试环境中,IIS 的应用程序池比我们的会话超时(我认为默认的 20 分钟)更快地回收(有时只需几分钟)。 Pool 循环导致所有 In-Proc 缓存数据丢失,冗长的加载过程不得不再次发生。

  1. 据我所知,没有序列化SpreadSheetGear 对象的功能(例如以xlsx 格式保存它)。如果我可以序列化它,那么我可能会切换到进程外缓存工具。但即便如此,与 In-Proc 内存缓存相比,我还是有点怀疑它的性能。
  2. 我无法弄清楚为什么会发生回收。虽然服务器内存不足,但我没有为 IIS 应用程序池设置任何内存限制或 VM 内存限制。我在 IIS 日志中没有找到回收事件。
  3. 是否有任何方法可以保护进程内内存数据以在应用程序池回收后继续存在?

有人对 SpreadSheetGear + ASP.NET MVC + IIS 有类似的经验吗?

【问题讨论】:

  • 到目前为止,我们将尝试使用 Azure VM,我可以在其中启动状态服务器。虚拟机也可以横向扩展(有一些限制:从可用性组预先配置),如果我可以很好地填充非循环、ARR 感知负载均衡器,那么我将是黄金
  • Out of proc State Server 也无济于事,这也需要序列化。我们自己希望最好,所以 IIS 不会决定回收

标签: asp.net-mvc caching iis-8 spreadsheetgear


【解决方案1】:

当多个会话占用太多内存时,我遇到了类似的问题。一旦达到阈值,IIS 就会终止随机会话以释放内存。解决方案是将缓存从 CacheItemPriority.Default 更改为 CacheItemPriority.NotRemovable。这样 IIS 将不会从内存中删除会话,并且在超时或会话关闭时,它将调用 CacheItemRemovedCallback() 并从内存中删除。

HttpRuntime.Cache.Insert(workbookPath, myWorkbook, Nothing, Cache.NoAbsoluteExpiration, New TimeSpan(0, 0, 1520), CacheItemPriority.NotRemovable, New CacheItemRemovedCallback(AddressOf OnRemoveCallBack))

【讨论】:

  • 感谢您的建议。现在我正在进行从客户端到服务器的定期轮询,直到会话到期(25 分钟)。但这在时机成熟时不会扩大。
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2010-09-19
相关资源
最近更新 更多