0

MySQLの.netコネクタ6.6.4.0で接続プールを使用して、以下のコードを使用して複数のスレッドにサービスを提供しようとしています。

static public uint uNonQuery(string query)
        {

                using (Connection = new MySqlConnection(ConnectionString))
                {
                    if (Connection.State == ConnectionState.Open)
                    {
                        Console.WriteLine("Its open..>!!!!");
                    }

                    Connection.Open();

                    MySqlCommand cmd = new MySqlCommand(query, Connection);
                    cmd.ExecuteNonQuery();


                    MySqlDataAdapter adapter = new MySqlDataAdapter("SELECT LAST_INSERT_ID() AS 'identity'", Connection);
                    DataTable dt = new DataTable();
                    adapter.Fill(dt);
                    uint ret = 0;

                    if (dt.Rows.Count > 0)
                    {
                        try
                        {
                            ret = Convert.ToUInt32(dt.Rows[0]["identity"]);
                        }
                        catch
                        {
                            ret = 0;
                        }
                    }

                    else
                        ret = 0;

                    Connection.Close();
                    return ret;
                }
        }

私の接続文字列は

"server = 127.0.0.1; user id = ****; password = ****; database = testdb; pooling=true; maximumpoolsize=500;"

そして、テスト用のスレッドは

static void DoInserts(object o)
{
    int i = (int)o;
    Console.WriteLine("Insert Thread {0} launched", i);


    for(int x = 0; x < 1000; x++)
    {
        uint insertId = DataLayer.uNonQuery(String.Format("INSERT INTO testdb.dbtest (writeNo,strNo) VALUES ({0},'x={0} thread={1}')", x, i));
    }

    Console.WriteLine("Insert Thread {0} completed", i);

}

例外が発生します例外:接続は有効で開いている必要があります。2つの同時スレッドで約6回挿入した後、プーリングが正しく機能するようにするために他に何かする必要がありますか?

ありがとう

4

1 に答える 1

1

あなたの行using (Connection = new MySqlConnection(ConnectionString))では、変数を使用していますConnection。この変数はどこで定義されていますか? 静的ですか?のスコープで定義する必要がありますuNonQuery。variableConnectionが static の場合、新しい関数呼び出しによって接続が開かれた後、接続が閉じられる可能性がありuNonQueryます。

例: - スレッド 1 が呼び出しuNonQueryて開き、実行します。- スレッド 2 が を呼び出しuNonQuery、接続を開きます。 - スレッド 1 が閉じます。Connection - 接続が突然閉じられたため、スレッド 2 は処理を実行できません。

上記が問題の原因でない場合は、問題を調べるためにさらに多くのコードが必要になります。

于 2013-02-07T20:43:46.433 に答える