DOBON.NETプログラミング道掲示板
(現在 過去ログ2 を表示中)

[ 最新記事及び返信フォームをトピックトップへ ]

■33561 / inTopicNo.1)  C# npgsqlでの動作
  
□投稿者/ Tour 一般人(1回)-(2017/01/23(Mon) 15:07:04)
  • アイコン環境/言語:[windows7] 
    分類:[.NET] 

    こんにちは、以下のように単純にDBへ接続してOPENとCLOSEをしています(実際にはSQL発行とかしていますが、以下のソースでも今回の現象が発生するため)
    そして、以下のような流れで動作させたときにExceptionが発生しないケースがあります

    1.ボタン1クリックで以下のプログラムを実行
    2.プログラウは起動したままサービスからDB(PostgreSQL)のサービスを停止
    3.ボタン1クリックで以下のプログラムを実行

    上記3を実行した時はPostgreSQLのサービスが起動していないので
    Exceptionへ飛んでほしいのですが、飛んでくれません

    もちろん最初からPostgrSQLのサービスを止めていたらExceptionへ飛びますが
    一度繋げてから、サービス停止した場合は、OPENでエラーにはならないものなのでしょうか?
    DBへ接続できなかった場合の処理を作成しているのですが、OPENで判断はできないのでしょうか?


    private void button1_Click(object sender, EventArgs e)
    {
    string connString = @"Server=localhost;Port=5432;User Id=postgres;Password=postgres;Database=DB1";
    NpgsqlConnection connection = null;

    try
    {
    // 接続先を設定
    connection = new NpgsqlConnection(connString);

    // 接続開始
    connection.Open();

    connection.Close();

    }
    catch (Exception ex)
    {
    Console.WriteLine(ex.Message);
    }
    finally
    {
    if (connection != null)
    {
    // 接続終了
    connection.Close();
    }
    }
    }
引用返信 削除キー/
■33562 / inTopicNo.2)  Re[1]: C# npgsqlでの動作
□投稿者/ Hongliang 大御所(531回)-(2017/01/23(Mon) 15:45:06)
  • アイコンNpgsqlは既定ではコネクションプーリングを行いますので、Npgsqlが保持しているコネクションオブジェクトをそのまま返してきているのでしょう。
    接続文字列にPooling=Falseを追加すればコネクションプーリングされなくなり毎回実際のDB接続が発生しますが、DBへの接続処理自体はそれなりに重い処理なので(だからこそコネクションプーリングという機構が作られた)、トレードオフといった感じです。
    しかしそもそもDBへのアクセス中にサービスが停止されるケースというのも考えれば、あえてOpenの時だけ特別視する意味も無いように思います。
引用返信 削除キー/
■33563 / inTopicNo.3)  Re[2]: C# npgsqlでの動作
□投稿者/ Tour 一般人(2回)-(2017/01/23(Mon) 16:02:39)
  • アイコンHongliangさん、ありがとうございます

    >しかしそもそもDBへのアクセス中にサービスが停止されるケースというのも考えれば、あえてOpenの時だけ特別視する意味も無いように思います。

    確かにおっしゃる通りだと思います、今回エラーが出た時にExceptionの文字列(ex.Message)をエラーメッセージとして表示しようとしています

    コネクションプールを使っている時は、OpenではエラーとならずSQL発行時に以下のようなエラーとなり、見てもよくわからないものになります
    「Exception while writing to stream」

    最初からPostgrSQLのサービスを止めていたらOPEN時に以下のようにメッセージが返ってきます
    「対象のコンピューターによって拒否されたため、接続できませんでした。」

    DBが停止しているのでこのようなメッセージが出てほしかったのです

    規模の小さいプログラムですので、今回はコネクションプールを利用しない設定で実装しようと思います

    ありがとうございました
引用返信 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/


- Child Tree -