【问题标题】:Pooling MySQL Connections with Microsoft Enterprise Library使用 Microsoft Enterprise Library 池化 MySQL 连接
【发布时间】:2016-06-07 09:57:14
【问题描述】:

我的设置是MySql.Data.MySqlClient v6.9.8.0Microsoft.Practices.EnterpriseLibrary.Data v6.0.0

该程序是一个长时间运行的程序,它不断运行以侦听任务,然后通过某种形式的数据库操作(取决于请求的内容)执行作业。有时请求会一个接一个,有时会有他们之间有几个小时。

我尝试在连接字符串中使用Pooling=true,但它给我带来了很多问题(并非总是如此——这些都是间歇性问题。)

这是一个例子:

[MySqlException (0x80004005): Authentication to host 'localhost' for user 'root' using method 'mysql_native_password' failed with message: Reading from the stream has failed.]

关闭pooling 解决了这个问题,但同时它使查询变慢,因为我们不能重用连接。我在网上搜索过,很多人都有同样的问题,我发现的唯一修复/解决方法是Pooling=false,如果可能的话我宁愿避免。

这是我的查询代码示例:

Database db = this.GetDatabase(databaseName);

List<dynamic> results = new List<dynamic>();

// Run the sql query
using (DbCommand dbCommand = db.GetSqlStringCommand(query))
{

    foreach (var parameter in inParameters)
    {
        db.AddInParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
    }

    foreach (var parameter in outParameters)
    {
        db.AddOutParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
    }

    using (IDataReader dataReader = db.ExecuteReader(dbCommand))
    {
        IDictionary<string, object> instance;

        do
        {
            // Read each row
            while (dataReader.Read())
            {
                instance = new ExpandoObject() as IDictionary<string, object>;

                // Populate the object on the fly with the data
                for (int i = 0; i < dataReader.FieldCount; i++)
                {
                    instance.Add(dataReader.GetName(i), dataReader[i]);
                }

                // Add the object to the results list
                results.Add(instance);
            }
        } while (dataReader.NextResult());
    }

    return results;
}

有什么想法吗?

【问题讨论】:

  • 哪个 EntLib.Data --> 你在使用 MySql “适配器”? entlibcontrib.codeplex.com/releases我没有看到编码为 EntLib 6。
  • 我是从 Nuget 安装的,这是显示给我的版本
  • 请报告nuget包和版本。只需在“packages.config”文件中找到该行即可。

标签: c# mysql .net connection-pooling enterprise-library


【解决方案1】:

你可以试试这个吗?我知道我知道。使用“使用”应该意味着我不必调用 dataReader.Close() 方法......但我仍然这样做。我还稍微修改了 dr.Read 块。

这家伙谈论它。

http://www.joseguay.com/uncategorized/ensure-proper-closure-disposal-of-a-datareader

我知道,我知道。你不应该这样做。即使在使用 Ent 库时,我也会执行额外的 .Close 步骤来尝试确保。

Database db = this.GetDatabase(databaseName);

List<dynamic> results = new List<dynamic>();

// Run the sql query
using (DbCommand dbCommand = db.GetSqlStringCommand(query))
{

    foreach (var parameter in inParameters)
    {
        db.AddInParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
    }

    foreach (var parameter in outParameters)
    {
        db.AddOutParameter(dbCommand, parameter.Key, parameter.Value.Item1, parameter.Value.Item2);
    }

    using (IDataReader dataReader = db.ExecuteReader(dbCommand))
    {
        IDictionary<string, object> instance;

        while (dataReader.Read())
        {
            instance = new ExpandoObject() as IDictionary<string, object>;

            // Populate the object on the fly with the data
            for (int i = 0; i < dataReader.FieldCount; i++)
            {
                instance.Add(dataReader.GetName(i), dataReader[i]);
            }

            // Add the object to the results list
            results.Add(instance);
        }

        if (dataReader != null)
        {
            try
            {
                dataReader.Close();
            }
            catch { }
        }           

    }

    return results;
}

【讨论】:

  • 几天过去了,它仍然像一种享受一样运行,谢谢!!
  • 经验法则是……如果您看到“连接不足”的问题……尽你所能正确摆脱它们…… .不管互联网上的“你不应该这样做”声明。
猜你喜欢
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 2013-05-25
相关资源
最近更新 更多