【问题标题】:Limit Connections to Database with Entity Framework C#使用实体框架 C# 限制与数据库的连接
【发布时间】:2016-08-03 13:54:49
【问题描述】:

我有一个限制为 60 个并发连接的 Azure 数据库。我的问题是我有几个爬虫填充这个数据库,供我们的网站使用实体框架使用。

多个爬虫很快就会耗尽所有连接并出错。我尝试在连接字符串中设置最大池大小值,但这似乎并未对实际数据库连接施加任何限制。

我可以将DbContext 包装在一个单例中,但是我会将整个爬虫限制为单个连接。

还有其他方法可以实现吗?

【问题讨论】:

  • 您使用的是什么版本的 EF?结合连接字符串中的Max Pool Size=60;,您是否设置了Pooling=true;(尽管那说true 无论如何都应该是默认设置)
  • 你是不是在完成连接后才释放连接?
  • @GeoffJames 是的,池化设置为 true。我试过设置 Max Pool Size =1;看看我是否可以限制连接。尽管如此,它仍然会根据需要产生更多连接。我目前使用的是 EF 6.1.3。我尝试过 Core,但按问题分组使其完全无法使用。
  • @JamieR 我们存储库中的所有内容都包含在 using 语句中。该代码利用了 TPL 库,因此它同时抓取 10 个不同的客户并不少见。有 10 个左右的盒子最终会用完。
  • @mscard02 只是想确定一下;)

标签: c# asp.net-mvc entity-framework connection-string azure-sql-database


【解决方案1】:

您正试图限制对共享资源的并发访问。通常为此使用Semaphore

要在单个框或单个应用程序中执行此操作,您可以使用 Semaphore or SemaphoreSlim

但是,如果客户端在不同的机器上运行,那么放置信号量的自然位置就是 SQL Server 本身。请参阅this article 了解一种实现方式。在使用 DbContext 访问数据库之前,应用程序需要调用 proc 来获取锁。信号量限制需要为 59 才能保持一个连接来读取信号量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    • 2013-10-13
    相关资源
    最近更新 更多