4

Oracle DB に接続された BDE を使用するアプリケーションがあります。
私は SQL クエリに TQuery を使用し、TDatabase に接続します。私たちはプロのプログラマーではなく、内部で何が起こっているのかわかりません。

ネットワークが不安定で、パケット損失の問題があります。

問題が発生すると、アプリケーションが DB サーバーから切断されるか、現在のクエリを完了できなくなります。
これを処理する最善の方法は何ですか?

ネットワーク チームは現在、根本的な問題の修正に取り組んでおり、障害が発生したときにデータベースに再接続するようにコードを変更しました。データベース サーバーで開いているセッションの数に問題があります。

これに対する解決策はありますか?
それは私たちにとって共通の問題のようです。

4

5 に答える 5

4

データベースコンポーネントについては、次のことをお勧めします。

  1. すべてのSQLで接続し、完了時に閉じます。
  2. タイムアウトがある場合は、接続タイムアウトを使用してクエリを再開します
  3. データベースが切断されている場合は、データをクライアントのローカルデータベースにスプールし、接続が再開されたら中央データベースへの送信を再開します。このようにして、データを失うことはありません。
  4. タイマーを使用して中央データベース接続をチェックし、未送信データのスプーリングを実行します。

この問題は現場のデータ収集によく見られ、上記の提案が問題を効果的に処理できる唯一の方法です。

于 2009-05-20T11:08:10.500 に答える
2

次のような「ウォッチドッグ」スレッドを実装してみてください。

  1. X秒ごとにネットワーク(データベースサーバーのIPアドレス)にpingを実行します
  2. 利用できない場合は、UIを無効にして、接続を再試行してください

トランザクションがまったく成功しない可能性があることを考慮し、その情報をどこかに保存します。次に、「ウォッチドッグ」スレッドを介して接続するときに、トランザクションの性質が許せば、そのトランザクションを再度実行してみてください。

于 2009-05-20T15:31:10.563 に答える
2

短い答えでごめんなさい...あなたのネットワークを直してください。これは、現時点であなたにとって本当に最良の選択肢です。

于 2009-05-20T00:36:42.527 に答える
2

n層ソリューションに行くことも役立つかもしれません...特に中間層もデータベースサーバー上にあり、その接続がローカルである場合. Delphi の最近の実装のほとんどは、カスタム HTTP サーバーを中間層として使用します。その利点は、実行中の現在の要求に対してのみ接続が必要になることです。要求が完了すると、問題なく接続を切断できます。 .

于 2009-05-20T21:58:05.087 に答える