2

asp.net c# webforms framework 4.5 を使用してプロジェクトを開発しています。Firebird データベースで接続テストを行いましたが、この接続を閉じても閉じないため、次のコードを使用して実行しました。

string conDDNS;
FbConnection conexaoDDNS;

protected void Abrir_Fechar_Click(object sender, EventArgs e)
{
    try
    {
        this.conDDNS = "DRIVER=InterBase/Firebird(r) driver;User=SYSDBA;Password=masterkey;Database=localhost:C:/AdCom/ADCOM.FDB";

        this.conexaoDDNS = new FbConnection(conDDNS);
        this.conexaoDDNS.Open();
        ListItem item = new ListItem("Conexão aberta");
        ListBox1.Items.Add(item);

        this.conexaoDDNS.Dispose();
        this.conexaoDDNS.Close();
        ListItem item2 = new ListItem("Conexão fechada");
        ListBox1.Items.Add(item2);

    }
    catch (Exception erro)
    {
        ListItem item = new ListItem(erro.ToString());
        ListBox1.Items.Add(item);
    }

}

すでに.Close()and.Dispose()コマンドを使用しましたが、機能しませんでした。

このデバッグを行ったとき、.Open()コマンドを渡すと接続が開かれることに気付きました。それで問題ありません。ただし、.Close()コマンドを渡すと、接続はデータベース上でまだ開いています。

データベースで開かれた接続の数を知るために、次のコマンドを使用しています。

select * FROM MON$ATTACHMENTS
4

1 に答える 1

9

Firebird .NET プロバイダーには組み込みの接続プールがあり、既定で有効になっています。接続文字列に追加Pooling=falseして無効にすることができます。ただし、多くの場合、接続プールは良いことです (接続を開く時間を節約できます)。そのため、本当に無効にする必要があることを確認してください。

または、プールで現在開いている接続を閉じる必要がありますFbConnection.ClearPool(connection)FbConnection.ClearAllPools()

また、クエリを実行するときは、必ず新しいトランザクションを開始してくださいMON$ATTACHMENTS。監視テーブルの内容は、単一のトランザクション内で「凍結」されます。

于 2016-02-16T16:34:12.220 に答える