【问题标题】:MySQL Entity Provider: "Too many connections"MySQL 实体提供程序:“连接太多”
【发布时间】:2013-07-30 08:23:56
【问题描述】:

在我们的 ASP.NET 应用程序中,我们实现了一个构建在 MySQL 之上的数据层,它使用Connector/NET 来实现实体框架。

这对于我们的大多数 CRUD 操作都非常有效,但是当我们运行包含数百条记录的 INSERT 语句时,它会引发“连接过多”异常。

虽然我接受我们正在进行大量单独的读/写调用(我们在每次插入之前查询重复条目,而且还有一个审计日志,该日志也使用每个插入的单独查询写入)但不应该连接池会处理这个吗?

另外,在this similar thread 中,OP 被告知要使用我完全同意的 using 语句,在我们的例子中,每个查询 is 都已经包含在 using 语句,我假设它正在以一种有效的方式管理连接:,如果另一个请求已排队,则不处理它们。

不管怎样,connect timeout 目前是 50,已经很小了,对吧?将其移至 500 没有任何区别,而将其移至 10 使我在抛出相同异常之前多插入了大约 50%。

那么,既然 DbContext 的每个实例都包含在 using 语句中,为什么我们会收到“连接太多”异常?

更新:我们发现问题的根源实际上是由于我们的一个存储库在其构造函数中打开了一个数据库连接,即使这个连接从未使用过。对不起,伙计们,这原来是一个红鲱鱼。感谢您的建议。

【问题讨论】:

  • max_connections 的值是多少?尝试阅读这篇文章,也许它可以帮助您:mysqlperformanceblog.com/2010/03/23/… 有趣的是:“您通常会为超级用户保留一个连接,但如果您的应用程序以超级用户身份连接,这将无济于事(这是一个坏主意无论如何)。”
  • max_connections = 100。我不想增加这个,因为我觉得这不是答案。它只是将问题推得更远。

标签: mysql .net entity-framework connector-net


【解决方案1】:

不完全是您正在寻找的答案...但是:

您没有为所有操作使用相同的连接是否有特殊原因?

举个例子:

如果您连续执行 50 次插入,因此使用相同的连接执行 50 次查询(每次插入一次)将大大提高您的系统性能。

【讨论】:

  • 您是否在问我们为什么不收集 50 个插入,然后调用 SaveChanges()?如果是这样,我们不能这样做,因为我们的审计日志需要具有由 DB 填充的属性的对象。要重写这将需要对我们的数据层进行重大重写。我想这可能的,但是是的,这不是我正在寻找的补救措施。
  • 另外,我们还需要在知道是否包含该实体之前检查重复项。
  • 我只是建议这样做,因为根据我从您的问题中得到的信息,您在打开和关闭与数据库的连接时占用了太多资源。您是否尝试过关闭 using 块内的连接?
【解决方案2】:

典型插入的平均执行情况如何?是否有可能在处理前一个请求之前获得新插入(带有所有围绕插入子查询)请求的连接?您是否尝试过分析/记录您的 DAL 插入功能在这种繁重的插入负载期间的执行情况?有时,通过将部分逻辑从“纯实体查询”移动到触发器(审计日志,请参阅How to program a MySQL trigger to insert row into another table?)和存储过程(查询重复项 + 自己插入),可以大大提高性能(如果这将是问题),如您对服务器的往返次数将更少/对查询的控制更多。

并且,作为最后一个选项,您可以尝试在 mysql 配置中挖掘,增加连接限制,默认为 100 个连接。但这个想法通常只是推迟在 DAL 中搜索瓶颈。

【讨论】:

    猜你喜欢
    • 2022-10-05
    • 2017-12-27
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多