• 締切済み

ネットワーク切断直後のPro*C処理エラー検出の時間短縮方法

以下のようなサーバ・クライアントでそれぞれ業務APを C言語+OpenMotif+Pro*Cで開発しております。 【 環境 】 <サーバ装置> ・RedhatES3 ・Oralce10g ・OpenMotif ・Pro*C クライアントからsend()されたDB更新要求をrecv()し、 DBの登録・更新・削除を行う。 DBアクセスにはPro*Cを使用。 <クライアント装置> ・RedhatES3 ・Oracleクライアント ・OpenMotif ・Pro*C 画面より入力されたデータをもとにサーバへDB更新要求を send()する。(クライアントでDBの更新は行わない) 画面にデータを表示する場合はPro*Cを使用   【 質問 】 以上のような構成でサーバ-クライアント間のLANケーブルを 抜き、すぐさまクライアントからデータの表示(DB参照)を 行おうとするとクライアントの画面全体が固まります。 (業務AP的にはフリーズ状態になってしまっている。) 5分くらいするとPro*C(Oracleクライアント?)が エラーを返却するのか、ボタン操作等は行えるようになるんですが この時間をせめて1分程度に出来ないかと方法を探しています。 Linuxのネットワークに関する質問に当たるかもしれませんが 皆さんお知恵を貸してください。

みんなの回答

noname#25383
noname#25383
回答No.3

申し訳ありませんが、これ以上は分かりません。 お役に立てず申し訳ありません。 とりあえず、以下の順で調べられると良いと思います。 1.Pro*Cによる、サーバーへのデータ送信時のタイムアウト設定 2.Oracleクライアントの設定 3.Linuxの設定 LinuxでTCPタイムアウト値のデフォルトを変更出来ると思いましたけど、やり方を忘れてしまいました。 とりあえず、Linuxのカーネルコンフィグレーションを調べましたが、TCPのタイムアウト設定はありませんでした。 多分、どこかの設定ファイルかと思います。

noname#25383
noname#25383
回答No.2

TCPのRFC(793)を調べたところ、デフォルトのタイムアウト値は5分ですね。 ですから、ソケットオプションのタイムアウトを設定すればいいかと思います。 socket生成後に、setsockoptでタイムアウト時間を設定すれば良いでしょう。 送信タイムアウトなら"SO_SNDTIMEO"だったと思います。

gootakakin
質問者

お礼

またまたmachirokaさん、ありがとうございます。 業務アプリケーションは上記の内容で修正できるのですが、Pro*CによるDBアクセスなどは変更できないですよね? OSのデフォルトタイムを変更する方法はご存じありませんか? もしくはOracle、Pro*Cの設定変更方法。

noname#25383
noname#25383
回答No.1

DBは素人なので的を外しているかもしれませんので、参考意見です。 おそらくクライアントの作りが、sendしたらrecvするまで待っているから止まっているかと思われます。 通常は、すぐrecvするので止まってないように見えるだけかと思います。 そして、recvのタイムアウトが5分に設定されているのでしょう。 recvのタイムアウトの設定方法を調査すれば良いかと思います。

gootakakin
質問者

お礼

参考意見ありがとうございます。 machirokaさんが仰っているようにPro*C(Oracleクライアント?)がサーバに対してsendを行い、recvが無いためPro*C自体も呼び元の業務APに対して応答を返していないようなのですが、どうすればもっと短くできるかが分からない状況です。 LinuxのTCPタイムアウト等について調べた方が良いんですかねぇ。。。

関連するQ&A