2016-05-02 1 views
0

私はある時点でテーブルのスナップショットを撮り、スナップショットと現在のデータの違いを判断する必要があります。それを行う最も効果的な方法は何ですか?純粋なSQL(MS SQL)で行うことができますか、または私のアプリケーションサーバーはDelphiコードでそれを行いますか?SQLまたはコード:テーブルスナップショットと現在のテーブルの違い。それはより効率的ですか?

私はこれらの変更を追跡し、Telnetプロトコルを介して同じマシン上の/任意の数のクライアントにそれらを送信するアプリケーションサーバーを使用しています。

txtプロトコルのため、何か変更があるたびにすべてのデータ(〜10kレコード)を送信することは実用的ではないため、テーブルの違いを使用する必要があります。

関連するアプリはSwordfish(自動取引システム/ ATS)ですが、私によって書かれたものではありません。アプリケーションサーバー(シェフ)とクライアント(ダイナー)、どちらも私によって書かれています。 ATSはMS SQLをAPIのレイヤーとして使用するため、ChefはMS SQLサーバーにデータを送受信し、本質的にATSを制御します。クライアントはシェフに何をしたいかを伝え、その後シェフはTelnetを介してDBMSと他のダイナーズを通じてSwordfishと話します。

+0

現時点では、サービスブローカーイベント – chillum

+0

を使用してSQLクエリの変更について通知を受けていますか?どのデータベースを使用していますか? 「何か変わるたびに〜10kレコードを送信する」とはどういう意味ですか?あなたのアプリは10,000レコードをメモリに保存していますか? Delphiでは通常、編集前に現在のレコードを取得します。 –

+0

a)他のアプリはアプリと同じマシンで動作していますか? b)それらはデータベースに変更を加える唯一のアプリですか、c)あなたが書いた他のアプリですか? – MartynA

答えて

0

コード。これを行う最も効率的な方法です。すでに存在しない行または列への変更を検出する私は、ウェブ上で

を見つけることができるすべての情報によると、行が追加されたどのような純粋なSQLを知ることが可能かもしれないが、私は(SQLで)何を見つけることができませんでした私のアプリケーションサーバー(SQLテーブルを意識して同期している)と私のアプリケーションクライアントを同期させるための知識が必要です。

10〜15kレコードのメモリ内テーブルを保持することはそれほど深刻ではありません。私のコードでTFDQueryとは異なるエラーが発生したため、テーブルの「オフライン」または「メモリ内」スナップショット必要なメモリがたくさんあります(すべてのsql addコマンドでTFDQueryのインスタンスが作成され、TFDQueryを破棄したときに漏れたレコードごとに30MBが必要です)、TFDQueryのインスタンスを一度作成し、追加されたレコードごとにインスタンスを再利用します。私は問題ありません)。

したがって、Service Brokerがsqlテーブルのデータセットの変更を検出するたびに、古いデータセットをインメモリテーブルに保存します。データセットとデータセット(保存されたデータセット/古いデータセットと最新のSQLテーブル)。 1.追加をスキャンします。 2.変更をスキャンします。 3削除の完了、完了:-)

その後、Telnetプロトコル用のテキストをエンコードする簡単な作業と、すべてのクライアントとSQLサーバーとアプリケーションサーバーがうまく同期されます。

関連する問題