私が開発しているシステムには、ハンドセットが「ドッキング」されているときに更新時にハンドセットに転送する必要がある設定データを含む PostgreSQL データベースがあります。ハンドセットがドッキングされている間、当社の「サービス ソフトウェア」はそれらと通信できますが、ドッキングされていない間は通信できません (ワイヤレスではありません)。
現時点では、ハンドセットが通信するサービス ソフトウェアが、起動時にデータベースからセットアップ データをロードしてキャッシュします。その後、5 秒ごとにセットアップ データの最新のタイムスタンプをクエリし、クエリされたタイムスタンプが最新のキャッシュされたタイムスタンプよりも大きい場合は、セットアップの一部をリロードします。
しかし、私はこの方法が行き当たりばったりだと思います。たとえば、更新トランザクションに 1 秒以上かかる場合、または少なくともトランザクションの送信からトランザクションの完了までの時間が 1 秒を超える場合 (now() 関数はトランザクションの開始時に PostgreSQL によって解決されます)。ラウンドについて考えることができる唯一の方法は、最新のタイムスタンプを照会する前にテーブル レベルのロックを行うことです。私はテーブルロックのファンではありませんが、問題を回避するために考えられる唯一の方法です。
このアプローチのもう 1 つの問題は、更新タイムスタンプが最後の最新のタイムスタンプを超えるのではなく、最後の最新のタイムスタンプを超えることに基づいて、新しいデータをクエリする必要があることです。なんで?クエリの直後にレコードが同じ秒内にコミットされる可能性があるため、レコードを見逃す可能性があります。
私が考えたもう 1 つの方法は、ハンドセットに保存する必要があるデータの論理項目ごとに、「最後に同期された日時」データをデータベースに保存することです。これは、ハンドセットごとに行います。次に、特定のハンドセットで現在同期されていないすべてのデータを定期的にクエリし、ハンドセットが最新の状態になったら、同期済みとしてマークします (これがフェールセーフになるメカニズムを考案し、その間に更新されるデータを考慮しました)。同期)。
このアプローチに関する私の唯一の問題は、データベースがビジネス中心ではないデータを保存していることを意味することです。つまり、システムを機能させるためにデータを保存しているのと同じです。どの携帯電話が同期しているかに関するデータが「ビジネス」データであるとは確信していません。私にとっては、ハンドセットサービスソフトウェア/ハンドセットソフトウェアが自分自身を最新の状態に保つ方法を知る責任がありますが、各ハンドセットにあるデータとそうでないデータを完全に記述し、クエリでデータのみを返すことができるため、魅力的です.必要です。
ただし、最初のアプローチでは、少なくともビジネスに適したデータ (つまり、データが最後に変更されたときのタイムスタンプ) のみを使用します。
理想的な方法は、何らかの通知システムを使用することですが、残念ながら、postgres には基本的な NOTIFY / EVENT システムしかなく、ODBC では機能しないようです (私はばかげて使用することにしましたが、今は変更する時間がありません)。 )。Oracle を使用していた場合は、Streams を使用できます。
考え?
注: データベースは純粋にリレーショナルです。この問題に対する「オブジェクト指向」のアプローチや、フレームワーク ベースのソリューションには興味がありません。
ありがとう。