c# - 多线程错误 : There is already an open DataReader associated with this Connection which must be closed first

标签 c# mysql multithreading

我有一个 Parallel.Foreach 循环

var options = new ParallelOptions();
options.MaxDegreeOfParallelism = 1;
Parallel.ForEach(urlTable.AsEnumerable(),drow =>
{
    using (var WCC = new MasterCrawlerClass())
    {
        WCC.MasterCrawlBegin(drow);
    }
 }

这个循环调用类并循环遍历我所有的数据行,但是这些数据行中的每一个要么填充数据表,要么对 MySQL 数据库执行更新命令。我拥有的这两个代码如下。

private static DataTable DTTable(string mysqlQuery, string queryName)
{
    DataTable DTTableTable = new DataTable();
    try
    {
        MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection);
        DataTable DataDTTablesDT = new DataTable();
        DataDTTables.SelectCommand.CommandTimeout = 240000;
        DataDTTables.Fill(DataDTTablesDT);
        DTTableTable = DataDTTablesDT;

    }
    catch (Exception ex)
    {

        GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery);

    }
    return DTTableTable;
}
private static void MySQLInsertUpdate(string MySQLCommand, string mysqlcommand_name)
{
    try
    {
        MySqlCommand MySQLCommandFunc = new MySqlCommand(MySQLCommand, MySQLProcessing.MySQLStatic.Connection);
        MySQLCommandFunc.CommandTimeout = 240000;
        MySQLCommandFunc.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", mysqlcommand_name, MySQLCommand);
    }
}

问题是 WCC 包含 10 个左右的空隙,这些空隙中的每一个都至少访问 MySQL 函数一次。因此,如果锁定是答案,是否可以为所有空隙创建 1 个锁定功能?如果是这样怎么办?如果有其他方法,请告诉我

谢谢!

好的,按照建议我合并了问题

代码现已更新以反射(reflect)锁定,请参见下文。

静态只读对象 _object = new object();

public static DataTable DTTable(string mysqlQuery, string queryName)
        {
            lock (_object)
            {
                DataTable DTTableTable = new DataTable();
                try
                {
                    using (MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection))
                    {
                        using (DataTable DataDTTablesDT = new DataTable())
                        {
                            DataDTTables.SelectCommand.CommandTimeout = 240000;
                            DataDTTables.Fill(DataDTTablesDT);
                            DTTableTable = DataDTTablesDT;
                            DataDTTables.Dispose();
                        }
                    }

                }
                catch (Exception ex)
                {

                    GenericLogging("Failed MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery);

                }
                return DTTableTable;
            }
        }

只有这一段代码调用了DataReader,有锁怎么会有两个打开的data reader?

最佳答案

问题是 ADO.NET 数据提供程序通常不允许每个连接同时打开一个以上的数据读取器。 SQL Server 有 multiple active result sets (MARS) 的概念, 但据我所知 MySQL 还不支持它。

您可能需要指定一个不同于 MySQLProcessing.MySQLStatic.Connection 的连接。没有什么能阻止您使用多个连接。这里的问题是连接是昂贵的资源,因此您应该谨慎使用它们。

关于c# - 多线程错误 : There is already an open DataReader associated with this Connection which must be closed first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081042/

相关文章:

c# - 虚拟方法可以中止覆盖它的抽象方法的执行吗?

c# - 获取在 lambda 中定义的属性 o => o.Property1 的值

php - 通过 PHP MYSQL 强制下载的 blob 格式不正确

php - 无法在运行 mysql 5.6 的 wamp 上启用 MySql 通用查询日志文件

c - 为什么我的全局分配结构没有正确更新值?

c# WebBrowser- 我如何等待 javascript 完成在文档加载完成时运行的运行?

c# - 具有另一个结构的固定大小数组的结构

php - 我们如何从 mysql 结果中选择随机行?

java - 从线程获取InputObjectStream

c++ - 将 2 个指针传递给 2 个线程,但它们最终共享相同的