2013-08-02 12 views
6

私はPostgreSQL 8.3を使用しており、libpq APIを使用するC++プログラムを作成しています。私はPQsendQuery()関数と非同期にコマンドを実行します。タイムアウト処理機能を実装しようとしています。タイムアウトが切れるとPQcancel()と呼んで実装しました。私は、1ミリ秒のタイムアウトで100 000行(約0.5秒続く)を返すクエリでそれをテストし、サーバが実行を終了するまでコマンドをキャンセルする代わりにブロックし、成功したクエリを返すことを発見しました。PostgreSQL:C/C++プログラムからクエリを取り消します。

私は、ドキュメントでは、キャンセル要求が成功してもクエリが実行される可能性があることを理解しています。私の問題は、PQcancel()が私の実行スレッドをブロックするということです。これは、非同期処理(Boost Asioフレームワークを使用)を使用するので受け入れられません。私のプログラムは、SQLクエリを実行する以外のタスクを実行する可能性があります。 。

通常はPQcancel()ブロックですか?ノンブロッキングキャンセル要求を行う方法はありますか?

+2

サイドノート:8.3バージョンはサポートされていません。サポートされているバージョンのいずれかにアップデートすることを検討してください。 –

+0

私が使用しているLinuxディストリビューションで出荷されているバージョンです(SUSE 11)。 – petersohn

+1

出荷方法は関係ありません。それはまだ時代遅れです。 –

答えて

2

私はPQcancelの実装を見ました。これは、サーバーへのTCP接続を別途作成するため、ブロックされています。このコード部分はPostgreSQLの最新バージョンとまったく同じです。だから私は別のスレッドでキャンセルを開始する以外の非ブロッキングにする方法がないと結論づけました。キャンセルオブジェクトは接続オブジェクトから完全に独立しているため、この機能を使用するのが好ましい方法です。したがって、スレッドセーフで完全に使用できます。

0

ブロック接続でこれを行うように聞こえます。ドキュメントでPQsetnonblockingを確認し、接続を非ブロッキングに設定してください.PQCancelをすぐに返すようにする必要があります。しかし、それはまた、接続上のすべての操作をノンブロッキングにします。

関連する問題