今日、今まで動いていたプログラムが動かなくなった。<br />
<br />
<br />
お昼にリーダーから一言、「データベース応答無かったら一定期間で切断する方法はない？」と相談があった。<br />
データベース接続は BDE で行っており、接続先データベースは Oracle、BDE は Oracle ドライバだとタイムアウトの設定がないので、他の手段を使うしかない。<br />
マルチスレッドで監視 か TCP/IP のタイムアウト、SQL*net でもタイムアウトの設定が設定できるとか...<br />
<br />
相談の結果今回はとりあえず、スレッドで接続してメインスレッドで一定時間で接続が確立されていなかったら、切ることになった。他の担当者はマルチスレッドは難しいと言っていたので、とりあえずサンプルを作ってテストすることになった。<br />
<br />
サンプルが完成したところで改めてなぜ応答が返ってこないのか確認したところ、DBリンクしているSQLでDBリンク先がオフラインだと応答が返ってこないとか....<br />
それって、Oracle 側の問題じゃないの？Oracle 側で設定してよ...<br />
<br />
しかも、それの状況すら間違ってるし...<br />
本当はプログラム内の SQL の Prepair で落ちてた。いろいろ調査した結果を整理すると、<br />
<ol><li>Prepair で無反応になる</li>
<li>昨日までは正常に動作していた</li>
<li>プログラムは変更されていない</li>
<li>変更点としては、OSのパッチが適用された</li>
<li>平SQLでは正常に動作する＞パラメータクエリだけがダメ(SQL Plus、Database Expolorerで確認)</li>
<li>他のSQLも問題なく実行出来る(他のパラメータSQLも)</li>
<li>テスト機では今でも同じプログラムが正常に動作する。</li>
<li>本番機とテスト機の差は、Oracle のバージョンが微妙に違う</li>
</ol>
<br />
以上の状況と、お客さんが「とりあえず動くようにして、問題調査は明日以降でもいいよと」言っていたので、3人で相談して<br />
とりあえず他の担当者にパラメータクエリのパラメータを埋め込みにしてもらって平SQLで動くように変更してもらった。<br />
それが、そのとき考えられる中で一番労力がかからず、しかもうまくいく可能性が一番高いように思えた。<br />
(Database Explorer は Delphi で作られているとのこと、ちなみに、Database Desktop は Delphi ではない。)<br />
<br />
その横の席で、リーダーと根本の原因を探り始めた。<br />
Linux カーネルと Oracle の相性か？そんなことがあり得るのか？と言う推測がリーダーから、くろねこの頭にあったのは、 Oracle の構文解析がなぜ失敗しているのか相性が原因でパーサーが構文解析のパーサーが動かない？と言うのも思ったが、それは状況別に別モジュールになっていない限り、たぶんないと思うとすぐに自己否定された。<br />
<br />
上記のの対策が終わらぬ間にその横で、リーダーに「SQLパーサーの動きがが変わったんなら、View に対して絞り込みする方法もやってみるとうまくいくかもしれませんね...」とか話してみた。<br />
リーダーは調査しながらも、とりあえず View を作ってくれた。<br />
<br />
そんな中、「Linux のカーネルパッチを適用したのなら、Oracle を落としてない？」と聞いてみたところ、Oracle の再起動を行っているとのこと。<br />
「じゃあ、メモリにあった構文解析のための情報ってなくなってるよね、馬鹿になったんじゃない？」と話をしてみた。<br />
その話を聞いていたお客さんが、「それなら、ヒントを与えればうまくいくじゃないの？」と、で SQL にルールベースの指定をしてみると、正常に動作する。(ちなみに元の SQL に戻して正常に動いた。しかしこれは一度ヒントを与えた SQL で学習したからだと結論づけた)<br />
<br />
結局、ルールベースの SQL で本番は行くことにした。そんな中、お客さんから一言「今回の問題の回避策って無いよね」、いや無い訳じゃないけど...「テストする際に一回データベースを再起動しておけば発見できたかもしれませんね。」と返しておいた。リーダーからは「現実的じゃないな」と、確かにハード面の費用とか結構かかるけどね...<br />
<br />
問題の解決が終わろうとしてたころ、他の担当者から「横で他の解決策の話をされると、この解決策は必要ないのか？と思う」と、「いろいろ試す前にホワイトボードに方法を全部書かないと...」とつっこみが...<br />
後者はまだわかるんだけど、前者はちょっとねわかるけどその方法がだめなときの次の手を準備するのは仕方ないんじゃ無いの？と言うのが正直な気持ちだった。