-2

基本的に、特定のデータセットをasp.netキャッシュに保存します。私が疑問に思っているのは、この方法で mysql 接続を開いたままにするかどうかです。「using」ステートメントを使用しているのに?

String cacheName="MY_QUERY_QACHE";

IEnumerable<DataRow> datarows = (IEnumerable<DataRow>)HttpRuntime.Cache[cacheName];

if(datarows==null){
    using (MySqlConnection conn = new MySqlConnection("MY CONNECTION STRING")){
        conn.Open();
            String strSQL="SELECT * FROM my_table etc... etc....";

            MySqlCommand cmd = new MySqlCommand(strSQL, conn);
            MySqlDataAdapter da = new MySqlDataAdapter();
            DataSet ds = new DataSet();
            cmd.Prepare();

            da.SelectCommand = cmd;
            da.Fill(ds);

            datarows = ds.Tables[0].AsEnumerable();
        conn.Close();
    }

    HttpRuntime.Cache.Add(cacheName,
        datarows,
        null,
        DateTime.Now.AddDays(1),
        System.Web.Caching.Cache.NoSlidingExpiration,
        System.Web.Caching.CacheItemPriority.Normal,
        null
    );
}
4

3 に答える 3

2

Using ステートメントは、次のことを遵守します。

原則として、IDisposable オブジェクトを使用する場合は、using ステートメントで宣言してインスタンス化する必要があります。using ステートメントは、オブジェクトの Dispose メソッドを正しい方法で呼び出します。また、(前に示したように使用すると)、Dispose が呼び出されるとすぐに、オブジェクト自体がスコープ外になります。using ブロック内では、オブジェクトは読み取り専用であり、変更したり再割り当てしたりすることはできません。

using ステートメントを使用すると、オブジェクトのメソッドを呼び出しているときに例外が発生した場合でも、Dispose が確実に呼び出されます。オブジェクトを try ブロック内に配置してから、finally ブロック内で Dispose を呼び出すことによって、同じ結果を得ることができます。実際、これは using ステートメントがコンパイラによってどのように変換されるかです。前のコード例は、コンパイル時に次のコードに展開されます (オブジェクトの制限されたスコープを作成するために追加の中かっこに注意してください)。

そのステートメントを使用すると、何が起こっても接続が閉じられるようにする必要があります。前述のように、Exceptionがあっても接続は閉じられます。その理由は、接続がこれから存在しないためです。

// Connection Doesn't Exists

using(SqlConnection connection = new SqlConnection())
{
    // Connection Exists
}

// Connection Doesn't Exists.

上記のコードからわかるように、これらの括弧の外にあるものはすべて範囲外になり、リソースを削除するIDisposableメソッドでインターフェイスを開始します。使用Disposeしていない場合は、開いたままにして、それを処理する責任があります。

うまくいけば、それはあなたの質問に答えます。これについても、Microsoft の Developer Network に詳細が記載されています。

于 2013-06-18T18:54:16.330 に答える
1

あなたのオブジェクトはブロックMySqlConnectionの範囲外には存在しません。ブロックusing内では、終了時に実装するオブジェクトで呼び出されます。ブロックで宣言されていない場合、実装するオブジェクトは自動的に破棄されません。この場合、手動で呼び出してリソースをクリーンアップする必要があります。usingDisposeIDisposableIDisposableusingDispose

于 2013-06-18T18:52:03.530 に答える