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/10081513/

相关文章:

c# - “PlaceHolder 不是已知元素”警告

c# - 将对象列表转换为 json 数组

mysql - 访问 Joomla 数据库

java - ActiveMQ OnMessage() 方法阻塞其他线程

c - pthread_join() 意外结果

c - 在 2 个 C 程序之间传输数据的最简单方法?

c# - 如何使用正则表达式从SQL语句中提取参数名称

c# - Serilog SelfLog 不输出任何东西

python - mysql 加密在 INSERT 和 UPDATE 上的行为是否不同?

php - 我想登录我的 cpanel 并从 cpanel 更新或删除文件