基础提供商在Open上失败了 - 无能为力

时间:2014-10-10 14:00:52

标签: c# mysql database entity-framework-6

我知道这个问题似乎与许多其他问题重复,但我在过去几个小时内完成了我的研究,发现 nothing 解决了我的问题。

由于我使用的是Entity Framework 6,所以一切正常。前几次测试完美无缺。但是,现在我们在数据库的较大部分上运行它,在查询量很大之后会弹出此异常。

  

底层提供程序在Open

上失败

  

System.Data.Entity.Core.EntityClient.EntityConnection.Open()

调用
  

System.Data.Entity.DbContext.SaveChanges()

我已将其缩小范围并尝试专门搜索SO,MSDN,CodeProject以及其他众多解决方案。显然,它们都没有奏效。否则我不会发布这个问题。

首先,一些可能有用的信息:

  • 我们正在使用MariaDB 5.5.38,将HeidiSQL作为数据库接口。
  • 我们正在使用Entity Framework 6。
  • 我们正在使用外部服务器来运行将大量数据写入本地数据库的程序。换句话说,服务器包含数据库和程序,因此只使用本地连接填充数据库。

现在奇怪的事情发生了;

我的应用程序完美地运行了一定数量的记录(插入了大约50.000条记录),然后出现此错误。我抓住了异常并试图让我的程序继续,这导致同样的错误被抛出(不是那么大的惊喜,但值得注意)。 ,如果删除当前数据库中的所有记录,程序将继续。因此,我们至少可以得出结论,我的数据或代码可能不是问题。

我的第一个想法是,也许我的记忆已经满了 - 但情况并非如此(我至少剩下18GB)。

我的第二个想法是,可能连接池太多了。即使这不应该发生,因为我每次都使用相同的连接字符串,这可能是我编码中的一个缺陷。但是,在调用MySql.Data.MySqlClient.MySqlConnection.ClearAllPools()后程序不会继续,如果我将MaximumPoolSize = 32767添加到我的连接字符串中也不重要。

我的第三个想法是,MariaDB的buffer_pool_size可能太小了。再次,增加后没有运气。在研究了这个缓冲池之后,我发现它也没有与这个问题有很多关系 - 但只是为了表明我已经研究过了。

我将提供一些可能导致问题的代码;

string _conStr;

MySqlConnectionStringBuilder providerConnStrBuilder = new MySqlConnectionStringBuilder();
providerConnStrBuilder.AllowUserVariables = true;
providerConnStrBuilder.AllowZeroDateTime = true;
providerConnStrBuilder.ConvertZeroDateTime = true;
providerConnStrBuilder.MaximumPoolSize = 32767;
providerConnStrBuilder.Pooling = true;
providerConnStrBuilder.Database = settings["dbname"];
providerConnStrBuilder.Password = = settings["dbpw"];
providerConnStrBuilder.Server = settings["dbsource"];
providerConnStrBuilder.UserID = settings["dbuid"];

EntityConnectionStringBuilder entityConnStrBuilder = new EntityConnectionStringBuilder();
entityConnStrBuilder.Provider = "MySql.Data.MySqlClient";
entityConnStrBuilder.ProviderConnectionString = providerConnStrBuilder.ToString();
entityConnStrBuilder.Metadata = "res://*/MyDbContext.csdl|res://*/MyDbContext.ssdl|res://*/MyDbContext.msl";

_conStr = entityConnStrBuilder.ConnectionString;

对于查询;

public void AnyQuery()
{
    using (var db = new MyDbContext(_conStr))
    {
        //Doing things with the context.
    }
}

而且,对于那些感兴趣的人,我实现了MyDbContext;

public MyDbContext(string conStr) : base(conStr){}

请注意,我已在MyDbContext语句中包含using的每一次使用。

摘要:程序运行良好,但在插入一定数量的记录后停止。如果清除数据库,它将继续。

0 个答案:

没有答案
相关问题