3

C#/ MySQLの相互作用の典型的な例には、次のようなコードが含まれます(簡単にするために、try / catchとエラーチェックはスキップしています)。

conn = new MySqlConnection(cs);
conn.Open();
string stm = "SELECT * FROM Authors";
MySqlCommand cmd = new MySqlCommand(stm, conn);
rdr = cmd.ExecuteReader();

シナリオは、スタンドアロンアプリケーションとWCFWebサービスの両方のクラスライブラリです。それで、クエリを実行するたびに接続を開く必要がありますか?または、プログラムを開くときに一度開く必要がありますか?

4

2 に答える 2

4

HackedByChineseの推奨事項を拡張するには、次のことを考慮してください。接続の作成、接続のオープン、トランザクションの設定、およびさまざまなタイプの作業(クエリ)を実行するワーカーメソッドの呼び出しを処理する1つの主要な調整メソッドがあります。

  public static void UpdateMyObject(string connection, object myobject)
        {
        try
        {
            using (SqlConnection con = new SqlConnection(connection))
            {
                con.Open();
                using (SqlTransaction trans = con.BeginTransaction())
                {
                    WorkingMethod1(con, myobject);
                    WorkingMethod2(con, myobject);
                    WorkingMethod3(con, myobject);
                    trans.Commit();
                }
                con.Close();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("SOMETHING BAD HAPPENED!!!!!!!  {0}", ex.Message);
        }
    }

    private static void WorkingMethod1(SqlConnection con, object myobject)
    {
        // Do something here against the database
    }

    private static void WorkingMethod2(SqlConnection con, object myobject)
    {
        // Do something here against the database
    }

    private static void WorkingMethod3(SqlConnection con, object myobject)
    {
        // Do something here against the database
    }
于 2012-05-20T19:44:03.700 に答える
3

通常、作業単位ごとに1つの接続を開きます。MySQL ADO.NETドライバーは接続をプールできますが、各クエリで接続を開くことはお勧めしません。発生する可能性があるのは、1つのビジネストランザクションを処理するためにいくつかの方法を使用し始め、それぞれが接続を開いているため、その1つのビジネストランザクションが使用可能な接続を枯渇させる可能性があることです。もちろん、これはタイムアウトやパフォーマンスの低下などにつながる可能性があります。

代わりに、接続とトランザクションを作成して開くIUnitOfWork/ APIを定義し、データアクセス層に現在の接続とトランザクションを提供する現在のを要求させることを検討してください。UnitOfWorkIUnitOfWork

もちろん、秘訣は、作業単位がいつ開始し、いつ終了するかを知ることです。それらは、完全で意味のあるアクション(「ビジネストランザクション」)に関連付けられています。たとえば、WCFサービスの1つでメソッドへの要求を処理している場合です。サービスインスタンスが開始すると、要求に応じて、作業単位を作成する必要があります。次に、DALコンポーネントは、現在の作業単位を要求して使用できます。次に、要求が完了すると、作業単位がコミットされます(トランザクションがコミットされ、接続が閉じられます)。

于 2012-05-20T17:07:12.770 に答える