概要
この記事では、TDVで公開したビューを使用している時に、エラーが発生したり、リクエスト後になかなかリプライが戻らない時など、問題を調査する際の基本的な手順を紹介します。
使用環境
製品 | バージョン | 実行環境 |
---|---|---|
TDV | 8.8.0 | Windows 10 |
エラーなどの発生するポイント
TDVで公開したビューは、JDBC, ODBC, ADO.NETを使用したクライアントアプリケーションなどからアクセスします。
クライアントアプリケーションからのリクエストは、TDVサーバーを経由して、データソースから収集され返されます。
エラーは、その経路上の4つのポイントで発生します。(下図参照)
どのポイントで、どのようなエラーが発生したかを調べ、その原因を取り除くことが基本的な方針となります。
通常のケースでは、①~④のどの箇所で発生したエラーであっても、クライアントへエラーが返されます。
返されたエラーメッセージを読み解き、発生したポイントとその内容を判別して対処することが基本的な手順となります。
ただ時には、処理中のままエラーも結果も戻らないようなケースがあります。
以下この記事では、エラーメッセージが返されるケースと、処理中のままとなるケースにおいての確認例を紹介します。
エラーメッセージが返されるケース
エラーは、クライアントアプリケーションが使用するJDBC, ODBC, ADO.NETなどのドライバから返されます。
通常のケースでは、前図①~④のどの箇所で発生したエラーであっても、クライアントへエラーが返されますので、そのメッセージから発生箇所とエラー内容を判別します。
ケース1:データソースでエラーが発生した例
JDBCドライバを使用するクライアントアプリケーションで、前図④のデータソースで発生したエラーをキャッチした例です。
java.sql.SQLException: An exception occurred when executing the following query: "select * from kb18.v_kb18_emp_name3".
Cause: Unable to invoke procedure "{? = call public.emp_name3()}". [data-2911039]
Unable to execute procedure call. SQL State = P0001 SQL Error Code = 0 [data-2911041]
Cause: ERROR: データソースでダミーエラーが発生しました
Where: PL/pgSQL関数emp_name3()の6行目 - RAISE [Log ID: 33e89a5a-263b-4fa6-9da5-69d107bc6103] [jdbc-1906510]
at cs.jdbc.driver.ResultSetImpl.next(ResultSetImpl.java:362)
at JdbcSample.main(JdbcSample.java:75)
Caused by: java.sql.SQLException: Unable to invoke procedure "{? = call public.emp_name3()}". [data-2911039]
Unable to execute procedure call. SQL State = P0001 SQL Error Code = 0 [data-2911041]
Cause: ERROR: データソースでダミーエラーが発生しました
Where: PL/pgSQL関数emp_name3()の6行目 - RAISE [Log ID: 33e89a5a-263b-4fa6-9da5-69d107bc6103]
at cs.jdbc.driver.ResultSetImpl.next(ResultSetImpl.java:356)
... 1 more
[...以下省略...]
スタックトレース全体を解析し、発生箇所とエラー内容を判別します。
「Where: PL/pgSQL関数emp_name3()の6行目 - RAISE」からデータソースで発生したことが分かります。
この例は、RAISE文で意図的にエラーを起こしたものですが、実際のエラーではその内容に基づき対処することとなります。
なお、クライアントへ返されたエラー内容は、TDVサーバーのログファイルにも出力されます。
[TDV_HOME]\logs\cs_server.log
ケース2:TDVサーバーからエラーが返された例
JDBCドライバを使用するクライアントアプリケーションで、前図②のTDVサーバーで発生したエラーをキャッチした例です。
java.sql.SQLException: An exception occurred when executing the following query: "select * from kb18.v_kb18_emp_name3".
Cause: The request to 'tdvserver.example.co.jp:9401' timed out after '60' second(s).
This timeout can be changed by adding requestTimeout=N to the URL connection string, where N is the number of seconds.
To disable the timeout, set N to 0.[jdbc-1900107][jdbc-1906510]
at cs.jdbc.driver.ResultSetImpl.next(ResultSetImpl.java:345)
at JdbcSample.main(JdbcSample.java:75)
Caused by: java.sql.SQLException: The request to 'tdvserver.example.co.jp:9401' timed out after '60' second(s).
This timeout can be changed by adding requestTimeout=N to the URL connection string, where N is the number of seconds.
To disable the timeout, set N to 0.[jdbc-1900107]
at cs.jdbc.driver.ResultSetImpl.next(ResultSetImpl.java:339)
... 1 more
[...以下省略...]
この場合も、スタックトレース全体を解析し、発生箇所とエラー内容を判別します。
この例では、TDVサーバー(tdvserver.example.co.jp9401) へのリクエストが、60秒のタイムアウトとなっています。
このエラーメッセージには回避方法も提示されています。
「This timeout can be changed by adding requestTimeout=N to the URL connection string, where N is the number of seconds. To disable the timeout, set N to 0.」
提示されたようにリクエストタイムアウト値を長くする方法や、ビューの構造を再検討し、クエリーに時間がかかる原因を取り除く対処方法などが考えられます。
エラーメッセージが返されないケース
エラーメッセージが返されない代表的な例は、クエリー結果もエラーメッセージも返されず、下図の様に、ただ処理中となるケースです。
SQLクライアントツール(DBeaver)から 公開ビューをクエリーした例
リクエストタイムアウト値が長めや無制限に設定されており、且つ、データソース、TDVサーバーでの処理に時間がかかる場合などに発生します。
どこで処理中となっているかを調べるには、Managerを使用します。
セッションページを開きます。
クライアントアプリケーションからTDVサーバーへログインしているセッションを特定し、セッションIDを表す「ID」をメモしておきます。
セッションの特定には、タイプ、所有者、ホスト、ログイン時間などを使用します。
次に、要求(リクエスト)ページを開きます。
先ほどメモしたセッションIDから、現在処理中のリクエストを特定します。
下例では2つあり、ステータス「RUNNING」が現在実行中の処理です。
RUNNINGとなっている、ID=10600902 の行を見ると、データソースPostgreSQL上の emp_name3() をコール中であり、この処理のリプライを待っていることが分かります。遅延している箇所が分かりましたので、この後は、PostgreSQL上のemp_name3() の処理を再確認し、処理遅延の原因を究明していくことが調査手順となります。
なお、調査をする中で、このリクエスト全体の実行計画を調べたい場合があります。その場合は、Studio版のManagerを使用します。
上図、リクエストIDを表す「ID」をメモします。(この例では 親となる10600901)
TDV Studio の マネージャー タブから、要求 ページを開きます。
同じ「ID」の行を選び、「クエリプランの表示」ボタンをクリックします。
クエリプランからも、この処理が現在実行中であることが分かります。
ここでは、単純な処理の完了待ちの例を使用しましたが、実環境では他の原因によるケースも発生しえます。ログファイルに関連するエラーが出力されていないかどうかの確認も推奨いたします。
ログファイルは、[TDV_HOME]\logs\cs_server.log を中心に、必要に応じて他のログファイルもご確認ください。
ログファイルの一覧は、下記リンクなどをご参照ください。
管理ガイド > TDV ログ情報 > TDV ログ ファイルについて > Server、Monitor、Studio のログ ファイル