2009-07-06 4 views
0

私たちは大きなプログラムを持っています、BDE + oracleを使って、delphiによって開発されたもの。 3つのスレッドを使用してDB操作を行います。 (1つのデーモンスレッド、1つのデータは、スレッド、1つのチェックスレッドを収集)BDEマルチスレッドエラー:ora-12560に遭遇したとき、TDatabaseを再起動できません

私たちは、この構造を使用します。

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が発生し、私たちのプログラムは接続を再開することができず、クエリ実行時にこのエラーを報告し続けます。

コードを確認して一週間をデバッグしても解決できない場合は、 同じ問題が発生していますか?

編集:

私たちは、このテストケースがあります。

3のプログラムを、それぞれ(1秒スリープして)一つのスレッドを実行し、そして0.5の間 - 1時間、彼らは皆、同じ時刻に失敗しました。 現在、私は回避策として自動再起動プログラムのmachanismに取り組んでいます。

+0

BDEをAdoに変更したいと考えていますが、Linuxワインがサポートしているかどうかはわかりません。 – linjunhalida

+0

"db.open"コードはどこにありますか? –

+0

クエリが開くと、dbが開きます。 – linjunhalida

答えて

0

を常時開いているDBを維持するために別々のタイマーベースのルーチンを持っている - それは、私たちは上記の私のコメントあたりの仕事です。 IEはデータベースが切断されたときにすぐに再オープンし、自動的に開くためにクエリに依存しません。タイマーを使用して、データベースがまだ(本当に)開いているかどうか定期的にチェックしてください。この方法では、別のスレッドを使用せずにクロススレッドの問題を回避しますが、私たちの場合、クライアントごとに1つの接続があります。各クライアントPCはデータを収集し、多数のクライアントPCが工場内にあります。

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

関連する問題