6

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 個程度のボイドが含まれており、これらのボイドのそれぞれが少なくとも 1 回は MySQL 関数にアクセスすることです。それで、ロックが答えなら、すべてのボイドに対して 1 つのロック機能を作成することは可能ですか? もしそうなら、どのように?他に方法があれば教えてください

ありがとう!

提案どおり、質問を統合しました

ロックを反映するようにコードが更新されました。以下を参照してください。

static readonly object _object = new object();

public static DataTable DTTable(string mysqlQuery, string queryName)
        {
            ロック (_object)
            {
                DataTable DTTableTable = new DataTable();
                試す
                {
                    using (MySqlDataAdapter DataDTTables = new MySqlDataAdapter(mysqlQuery, MySQLProcessing.MySQLStatic.Connection))
                    {
                        使用 (DataTable DataDTTablesDT = new DataTable())
                        {
                            DataDTTables.SelectCommand.CommandTimeout = 240000;
                            DataDTTables.Fill(DataDTTablesDT);
                            DTTableTable = DataDTTablesDT;
                            DataDTTables.Dispose();
                        }
                    }

                }
                キャッチ(例外例)
                {

                    GenericLogging("失敗した MySQLquery: " + ex.Message.ToString(), "MySQLProcessor", "DTTable", "", "MysqlError", "", queryName, mysqlQuery);

                }
                DTTableTable を返します。
            }
        }

これは DataReader を呼び出す唯一のコードです。ロックがある場合、どのようにして 2 つのデータ リーダーを開くことができますか?

4

2 に答える 2

2

問題は、ADO.NET データ プロバイダーでは通常、接続ごとに一度に複数のデータ リーダーを開くことができないことです。SQL Server には複数のアクティブな結果セット (MARS)の概念がありますが、私の知る限り、MySQL はまだサポートしていません。

おそらく、 以外の別の接続を指定する必要がありますMySQLProcessing.MySQLStatic.Connection。複数の接続を使用することを妨げるものは何もありません。ここでの問題は、接続は高価なリソースであるため、慎重に使用する必要があることです。

于 2012-04-10T00:31:48.030 に答える
0

同時に同じ接続を使用しています。

あなたはいくつかのスレッドを持っていますか?2 つのスレッドが同じ接続を使用して同時に呼び出しを行っているように見えるためです。

于 2012-04-10T00:35:37.987 に答える