はじめに太字を多用しておりますことをお詫び申し上げます。私の長い質問の仕方を簡単に理解したかったのです。
データへの複数アクセスに問題があります。
次の問題を実装する必要があります。多くの (約 100) TCP 接続を持つサーバー アプリケーションSERVER_A (TIdServer に基づく) があります。これらの接続のそれぞれの目的は次のとおりです。
- CLIENTからステータス メッセージ (2 ~ 5 秒ごと) を取得します。ステータスには、テキストとして保存された 3 つの二重数値が含まれます。
- SERVER_A からCLIENTに回答を送信- ステータスを取得した後
これらのステータス (約 100) は、Firebird データベース テーブル - TABLE (私はこの AnyDAC を使用しています) に保存する必要があります。各CLIENTには、その番号とそのレコードがTABLEにあります。
3 つの別のローカル ネットワーク クライアント アプリケーション - LOCAL_APPLICATIONSもTABLEにアクセスする必要があります。TABLEからの統計データを視覚化する必要があります。
LOCAL_APPLICATIONSは、 TABLEのレコードの 1 つを変更する必要がある場合があります。結果として、この変更は、応答としてSERVER_Aの TCP 接続を介して適切なCLIENTに配信される必要があります。
問題は、そのような解決策が達成される効率にあります。
これまでのところ、すべての TCP 呼び出しが個別にTABLEにデータを書き込み、Firebird に大規模な過負荷を引き起こし、LOCAL_APPLICATIONSによる操作はいずれ も非常に低速です。
したがって、私は尋ねることができます:正しいアプローチは、SERVER_AにLOCAL_ARRAYを構築し、すべての TCP 接続からデータを収集し、それらすべてを一定の時間間隔で定期的に (たとえば 2 秒ごとに) TABLEに保存することですか? もしそうなら、効率的なデータ同期を行う方法: LOCAL_ARRAYのロックを変更し、そこからデータを読み取ってTABLEにデータを保存する間にロックしますか?
接続ステータスごとに単一の変数を使用し、LOCAL_ARRAYを使用して、1 つのCLIENTからデータを挿入する際にLOCAL_ARRAYのすべてのフィールドをロックしないよう にすることをお勧めします。しかし、それは柔軟な解決策ではありません。
私のアイデアは効率を上げるのに良いですか?というかそうじゃない?より良い解決策は何ですか?
よろしく Artik