データをオフラインでデータベースに保存するJavaデスクトップアプリケーションを作成したいと思います(一部の構成ファイルだけではありません)。ユーザーがオフラインのとき、アプリケーションは正常に動作するはずです。ユーザーがオンラインになると、オフラインデータベースがオンラインマスターと同期できるようになります。
これを達成するためにどのテクノロジーを使用できるかについてのアイデアはありますか?
これはstackoverflowで多く議論されており、通常は次のように要約されます。独自のソリューションを展開しないでください-これは非常に専門的な分野です-SymmetricDSを検索してください。それはあなたが望むことをします。
私のお気に入りの議論の1つは、オフライン/オンラインデータ同期の戦略です。
利用可能な純粋なJavaDB実装の1つをローカルDBとして使用します。他のDBをリモートDBとして使用します。リモートDBに接続しようとし、障害が発生したときにローカルDBにフォールバックするロジックを実装します。リモートDBに正常に接続されたら、データ同期を実装します。
ローカルアプリケーションが動作するときは、データベースを変更するだけでなく、変更をログに記録する必要があります。その変更は、接続が利用可能になるとサーバーに送信されます。また、アプリケーションは、サーバーに保存されているログに記録された変更を(他のアプリケーションインスタンスから)受信します。
主な問題は、異なるインスタンスによって行われた変更をどのようにマージするかです。3つのバリエーションがあります。
1)各アプリケーションインスタンスは、データベース全体のプライベート部分のみを変更できます。幸運なことに、マージは必要ありません。サーバーはログのみを保存でき、データベース全体を実行することはできません。
2)変更は常に自動的にマージできます(たとえば、アプリケーションは共通変数に値を追加できますが、直接設定することはできません)。サーバーはデータベース全体を実行し、クライアントから部分的なログを受け入れ、独自のログを生成してクライアントに送信します。
3)クライアントは任意の変更を行うことができます。これは潜在的な競合につながります。競合する場合は、競合する変更の1つを拒否する必要があります。つまり、クライアントがローカルで変更を加えた場合、その変更は後でサーバーによって拒否される可能性があります。ユーザーインターフェイスはこの問題を反映している必要があります。残りの部分では、これはバリアント2に似ています。