■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等、事前に調べた事が役に立って良かったです。
トップへ戻る