■VB.Netプログラムエラー

○VB.Netでエラーが発生しました。
Npgsql.NpgsqlException:  A timeout has occured. If you were establishing a connection,
increase Timeout value in ConnectionString.
If you were executing a command, increase the CommandTimeout
value in ConnectionString or in your NpgsqlCommand object.

・タイムアウトが発生しました
 try catchでのエラー処理でex.messageとやると上のエラーが出ます
 それをex.tostringにすると

Npgsql.NpgsqlException:  A timeout has occured. If you were establishing a connection, increase Timeout value in ConnectionString.
If you were executing a command, increase the CommandTimeout value in ConnectionString or in your NpgsqlCommand object.
場所 Npgsql.NpgsqlState.ProcessBackendResponsesEnum(NpgsqlConnector context, Boolean cancelRequestCalled)
場所 Npgsql.NpgsqlReadyState.QueryEnum(NpgsqlConnector context, NpgsqlCommand command)
場所 Npgsql.NpgsqlConnector.QueryEnum(NpgsqlCommand queryCommand)
場所 Npgsql.NpgsqlCommand.GetReader(CommandBehavior cb)
場所 Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior cb)
場所 Npgsql.NpgsqlCommand.ExecuteReader()
場所 「プログラム名」.「クラス名」.「メソッド(引数)」
場所 「ソースのパスと名前」:行 「行数」
場所 「プログラム名」.「メソッド(引数)」
場所 「ソースのパスと名前」:行 「行数」

・これだけ詳しい情報が得られます。エラー時に調べやすいのでお勧めです。

・SELECTしている所でSQLが分かったのでpgAdminで実行してみました。
 すると非常に遅く、原因だと分かりましたpgAdminは調査が出来るので
 確認した所インデックスが使われておらずseq scanになっていました
 インデックスを作成した所、速度が改善され、エラーが出なくなりました。

・VB.NetでNpgsqlを使っていますがCommandTimeoutがデフォルト20秒との事
 SQL一つに20秒以上かかったと言う事です。規模的にありえない時間でした
 原因は副問合せでseq scanを何度も行っていた為非常に遅くなったようです。

・DB設計で適切なインデックスを作るのは当然として対応策として
 PostgreSQLで遅いクエリのログ出力を行う事にしました
 postgresql.confを書き換えます。

vi /var/lib/pgsql/data/postgresql.conf
log_min_duration_statement = 10000

※PostgreSQLの再起動が必要

・log_min_duration_statementをミリ秒で指定します。今回は10秒としました
 この辺はDBによって変わります。今回は小さいシステムでエラーが20秒で
 出るのがデフォルトなのでエラーが出る前に気づけるように10秒としてみました
  これで定期的なログチェックで遅いSQLが分かるとエラーが出る前に対応
 できそうです。

インデックスが動いていないと言う基本的な問題でしたが
原因や対応方法の調査を行うのは色々と勉強になりました。
VB.Netのex.ToStringやpgAdmin等、事前に調べた事が役に立って良かったです。

トップへ戻る