【问题标题】:Reuse CloudBlobClient Object重用 CloudBlobClient 对象
【发布时间】:2012-04-13 14:46:14
【问题描述】:

我有这两个对象用于 Azure Blob 存储访问,并希望在 ASP.NET MVC 应用程序中使用它们。

CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("Deesd");

我的问题是:我可以在所有应用程序请求中重复使用相同的对象实例,还是应该在每个方法中实例化一个新对象?

【问题讨论】:

    标签: azure azure-storage azure-blob-storage


    【解决方案1】:

    你可以重用实例,只是不要从多个线程同时访问同一个实例,因为它不是线程安全的。

    2019 年 4 月更新(7 年后)

    注意:您应该始终查阅最新的 SDK 文档。

    是的,现在(至少在本次更新中)在较新版本的 SDK 中以线程安全的方式使用 CloudBlobClient 和其他对象是安全的。事实上,您找到的一些文档鼓励这样做,但在技术上仍不能保证在设计上保持这种状态(例如,SDK 的未来主要版本可能会违背这一点)。

    像往常一样,您可能应该为您的应用程序级逻辑提供一个抽象,以尽可能地隐藏客户端及其生命周期。然后让抽象担心生命周期管理。也许今天使用一个简单的静态实例,明天可能使用池化,但至少如果出现问题,您的大部分应用程序逻辑都是从中抽象出来的。 ?

    【讨论】:

    • 同时重用和使用是两个不同的东西,因此我的回答中有明确的区别。
    • 我仍然相信我的回答是正确的,虽然是的,但文档一般警告您不要这样做。
    • 我不买这个公认的答案。在阅读此答案之前,我会进行更多研究,并最终在您不需要时创建数千个客户。阅读下面西蒙的答案。
    • 我同意安迪的观点。对客户端的并发访问是没有问题的......它是为这种访问而设计的 - 这个答案在说不要时是不正确的 - 它实际上是可取的(见下面我的答案)
    【解决方案2】:

    您可以重复使用它。据我所知,除了初始化时,它不包含任何状态。

    【讨论】:

    【解决方案3】:

    This link 明确指出您应该跨请求重用同一个客户端,因为这些客户端管理连接,因此能够优化底层调用以建立与服务的连接。

    This is the direct link to Microsoft Documentation 也这么说

    Cosmos Db advice 的相似之处在于它建议在应用程序的整个生命周期中使用单例模式

    【讨论】:

    • 多线程并发呢?我假设这是肯定的。接受的答案正好相反,这太糟糕了。
    • 并发多个线程 - 是的。一旦创建了客户端,从多个线程访问它就没有问题(因为他们没有修改它)
    【解决方案4】:

    取决于客户端版本,我在这里找到了 Microsoft 某人的答案: https://github.com/Azure/azure-storage-net/issues/732#issuecomment-745749919

    至于制作 CloudBlobClient 单例。人们可以尝试这样做并取得一些成功。但是,请注意 V11 和 CloudBlobClient 和 CloudBlob 等之前的类型是有状态的。它们可能具有可变属性,并且某些 API 可能会改变状态。因此,我建议在尝试此操作时要小心。 我强烈建议迁移到 V12,其中所有客户端都设计为无状态,并且可以在任何生命周期内安全使用

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 2021-01-09
      • 2016-10-30
      • 2019-09-16
      • 2017-07-02
      • 2010-09-28
      • 2010-10-25
      • 2017-09-21
      • 2015-03-09
      相关资源
      最近更新 更多