MySQL实体提供程序:“;“连接太多”;

MySQL实体提供程序:“;“连接太多”;,mysql,.net,entity-framework,connector-net,Mysql,.net,Entity Framework,Connector Net,在我们的ASP.NET应用程序中,我们实现了一个构建在MySQL之上的数据层,该层用于实现实体框架 这对于大多数CRUD操作都非常有效,但是当我们运行一个包含数百条记录的INSERT语句时,它会抛出一个“太多连接”异常 虽然我承认我们正在进行很多单独的读/写调用(我们在每次插入之前查询重复的条目,另外还有一个审计日志,它也会在每次插入时使用单独的查询写入),但是连接池不应该考虑这一点吗 此外,在OP中,我完全同意使用using语句,在我们的例子中,每个查询都已包装在using语句中,我假设该语句

在我们的ASP.NET应用程序中,我们实现了一个构建在MySQL之上的数据层,该层用于实现实体框架

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

虽然我承认我们正在进行很多单独的读/写调用(我们在每次插入之前查询重复的条目,另外还有一个审计日志,它也会在每次插入时使用单独的查询写入),但是连接池不应该考虑这一点吗

此外,在OP中,我完全同意使用using语句,在我们的例子中,每个查询都已包装在using语句中,我假设该语句以有效的方式管理连接:即,如果另一个请求已排队,则不处理它们

不管怎么说,
连接超时目前是50,这已经很小了,对吗?将其向上移动到500没有任何区别,而将其向下移动到10则在引发相同异常之前为我提供了大约50%的插入

所以,既然DbContext的每个实例都包装在一个using语句中,为什么会出现“太多连接”异常


更新:我们发现问题的根源实际上是因为我们的一个存储库在其构造函数中打开了一个DB连接,尽管这个连接从未使用过。对不起,伙计们,这只是一个骗局。谢谢你的建议。

这不是你想要的答案。。。但是:

是否有一个特殊的原因使您的所有操作不使用相同的连接

例如:


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

典型插入的平均执行情况如何?在处理前一个insert请求之前,是否有可能获得新insert(具有全方位insert子查询)请求的连接?您是否尝试分析/记录了DAL insert函数在这个繁重的insert负载期间的执行情况?有时,通过将部分逻辑从“纯实体查询”移动到触发器(审核日志记录,请参阅)和存储过程(查询重复项+插入项本身),可以极大地提高性能(如果这是问题的话),因为您可以减少到服务器的往返次数/更多地控制查询


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

您是否在问我们为什么不收集50个插入,然后调用SaveChanges()?如果是这样,我们就不能这样做,因为我们的审计日志要求对象的属性由DB填充。要重写它,需要对数据层进行重大重写。我想这是可能的,但是,是的,这不是我一直在寻找的补救办法。另外,我们还需要在知道是否包含该实体之前检查重复项。我只是建议这样做,因为根据我从您的问题中得出的结论,您在打开和关闭与数据库的连接时消耗了太多的资源。您是否尝试关闭using块内的连接?max_connections的值是多少?试着阅读这篇文章,也许它能帮助你:有趣的是:“你通常会为超级用户保留一个连接,但如果你的应用程序是以超级用户的身份连接的话,那就没用了(这是个坏主意)。”max_connections=100。我不想增加这个,因为我觉得这不是答案。这只是把问题推得更远一点。