MultiThreading错误:已经有一个与此Connection关联的打开DataReader,必须先关闭它

时间:2012-04-09 23:13:57

标签: 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);
    }
 }

这个循环调用类并循环遍历我的所有DataRows,但是每个数据行都会执行DataTable填充,或者对MySQL DB执行更新命令。我对这两个代码的代码如下。

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个锁定功能?如果是这样的话?如果还有其他方式,请告诉我

谢谢!

好的,如我所知,我整合了问题

代码现已更新以反映锁定,请参阅下文。

static readonly object _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的唯一代码,如果有锁定,如何有两个开放数据读取器?

2 个答案:

答案 0 :(得分:2)

问题是ADO.NET数据提供者通常不允许每个连接一次使用多个开放数据读取器。 SQL Server具有multiple active result sets (MARS)的概念,但据我所知,MySQL还不支持它。

您可能需要指定MySQLProcessing.MySQLStatic.Connection以外的其他连接。没有什么可以阻止您使用多个连接。这里的问题是连接是昂贵的资源,所以你应该谨慎使用它们。

答案 1 :(得分:0)

您正在同时使用相同的连接。

你有几个线程吗?因为似乎2个线程使用相同的连接来同时进行调用。