0

delphiによって開発されたBDE+oracleを使用した大きなプログラムがあります。3つのスレッドを使用してDB操作を実行し、別々のTSessionを使用しています。(デーモンスレッド1つ、データ収集スレッド1つ、チェックスレッド1つ)

この構造を使用します:

TQuery-> TDatabase-> TSession

このメソッドを使用してクエリを実行します。

try
  qu.close;  //TQuery
  qu.sql.clear;
  qu.sql.add('select foo from db_foos');
  qu.open;
except
  on e:Exception do
  begin
    db.close; // db is TDatabase, We use this to auto restart connection when network fail.
    error(e.message);
  end;
end;

問題は、プログラムが24時間以上実行されると、ora-12560が発生し、プログラムが接続を再開できず、クエリの実行時にこのエラーを報告し続けることです。

コードを確認し、1週間にわたってデバッグしましたが、それでも解決できません。同じ問題が発生しますか?

編集:

このテストケースがあります:

3つのプログラム、それぞれが1つのスレッド(1秒間のスリープ)を実行し、0.5〜1時間の間、すべて同時に失敗しました。(3つのDB操作、および1つのIndy9 ftpクライアント...)

ですから、BDEまたはWindowsソケットに何か問題があると思います...現在、回避策として自動再起動プログラムのメカニズムに取り組んでいます。

4

2 に答える 2

0

どうやらこれは、Oracleクライアントが接続するはずの場所を忘れてしまうという一般的な問題です。おそらく、これらの1つが役立ちます。

http://www.cryer.co.uk/brian/oracle/ORA12560.htm

http://www.dba-oracle.com/t_ora_12560_tns_protocol_adapter_error.htm

于 2009-07-06T18:41:55.030 に答える
0

DBを常に開いたままにするために、別個のタイマーベースのルーチンを用意します。これは、上記の私のコメントに従って行うことです。IEは、データベースが切断された後、すぐに再度開きます。クエリに依存せずにデータベースを自動開きます。タイマーを使用して、データベースがまだ(実際に)開いているかどうかを定期的に確認します。このように、個別のスレッドを使用せず、クロススレッドの問題を回避しますが、この場合、クライアントごとに1つの接続があります。各クライアントPCはデータを収集し、工場には多くのクライアントPCがあります。

あなたの場合、すべてのスレッド内にDBチェックルーチンが必要になる場合があります。

于 2009-07-07T13:46:43.943 に答える