2

だから私は自分自身がベストプラクティスであることに苦労しています。C# をコーディングするのはこれが初めてで、何かをコーディングするのは 10 年ぶりです。私がphp / sqlプログラマーとして働いていたとき、私たちは通常、クエリごとに新しい接続を開くという考えに眉をひそめていましたが、今日Googleでこの質問を、特にC#とsqliteで調査すればするほど、多くの人がそうすることを推奨しているようです.正反対。

だから、私は、明らかにこれを目よりもずっと多くやっている人たちのために、この質問を出してくれることを望んでいました. 私のデータベースクラスの一般的なセットアップは次のとおりです。

class DatabaseController
{

    static private SQLiteConnection _sqlconn;
    static private string _uri;

    public static SQLiteConnection Sqlconn
    {
        get { return DatabaseController._sqlconn; }
        set { DatabaseController._sqlconn = value; }
    }

    public static string Uri
    {
        get { return DatabaseController._uri; }
        set { DatabaseController._uri = value; }
    }

}

2 番目のクラスは、実際のクエリの実行などを処理するメインのデータベース クラスです。私が DatabaseController クラスを持っている理由は、開いている接続ハンドルを静的メンバー _sqlconn に格納できるため、接続は一度しか開かれず、プログラムが多くのデータベースを作成できる場合でも、データベース オブジェクトは単純に同じハンドルを使用するためです。オブジェクト。

しかし、繰り返しになりますが、これは実際に必要ですか?オブジェクトが作成されるたびに、メインの Database クラス内で新しい接続を開くだけでよいのでしょうか? 私が見つけた別のサイトとスレッドがありました.NET Frameworkが行うことは、接続プールを維持していても. これは本当にそうで、デスクトップ アプリと Windows 8 アプリの両方に当てはまりますか?

4

2 に答える 2

0

必要な間、つまり作業単位が必要な間だけ、接続を「開いた」ままにしておくことをお勧めします。

あなたが提案したように、それらを「閉じる」と、実際には閉じられませんが、他のスレッド/アプリケーションによる再利用のためにプールに返されます。これは、すべての ADO.NET データ プロバイダーに適用されます。

アプリケーションがシングル スレッドの場合、プーリングが発生していることに気付かないかもしれませんが、データ アクセスを必要とするスレッドが多数ある状況では、接続がプールに返されるのが早くなり、他のスレッドが再利用できるようになります。 .

于 2013-09-10T10:10:33.357 に答える
0

sqlite を使用する場合、エンジンがどのようにコンパイルされたかを知る必要があります。ここhttp://sqlite.org/threadsafe.htmlを参照してください。使用するスレッド モデルによって sqlite の動作が異なるため、これは重要です。

データベースにアクセスするすべてのコード間で接続が共有されるロジックが必要になる場合があります。異なるスレッドが Sqlite db で同時に動作するのを防ぐコードが必要になる場合もあります。

Close()他のほとんどの ADO.NET プロバイダーは接続プールをサポートしています。これは、メソッドを呼び出すときに接続が再利用されることを意味します。

于 2013-09-10T10:11:27.107 に答える