私の要件は、サーバーJ2EE WebアプリケーションとクライアントJ2EE Webアプリケーションがあることです。ときどきクライアントがオフラインになることがあります。クライアントがオンラインになると、前後の変更を同期できるはずです。また、いくつかのフィルター/ルールに基づいて、どの行/テーブルを同期する必要があるかを制御できるはずです。既存のJavaを実行するためのフレームワークはありますか?自分で実装する必要がある場合、提案できるさまざまな戦略は何ですか?
私の心の1つの解決策は、SQLログを維持し、同期中に反対側で同じステートメントを実行することです。この戦略に問題がありますか?
Javaデータの同期/レプリケーション用のライブラリがいくつかあります。私が知っている2つは daffodil と SymmetricDS です。以前の人生私は愚かにも自分のデータ複製プロセスを(Javaで)実装しました。これはかなり簡単なことのように思えますが、データを複数の場所で同時に更新できる場合、それは非常に複雑です。1つ使用することを強くお勧めします前述のプロジェクトの中で、この複雑さへの対処を自分で回避しようとしています。
同期の最大の問題は、ユーザーがオフラインで何かを編集し、同時にオンラインで編集する場合です。変更された2つのデータをマージするか、UIを処理して、ユーザーが正しいバージョンを言うことができるようにする必要があります。両方が同時に編集される可能性を排除すれば、この厄介な問題を解決する必要はありません。
通常、メソッドはすべてのテーブルに「変更済み」フィールドを追加し、サーバーの変更日と比較して、特定の行の特定のレコードのクライアントの変更済みフィールドを比較します。それらが一致しない場合は、サーバーのデータを置き換えます。
自動生成されたキーに注意してください。クライアントからサーバーにコピーするときに、データの整合性が維持されていることを確認する必要があります。サーバーでSQLステートメントを厳密に再度実行すると、自動生成されたキーが変更され、突然、外部キーが意図したものとは異なるレコードを指している状況になる可能性があります。
多くの場合、別のソースからデータをインポートするときは、外部ソースからの主キーと自分の個人主キーを追跡します。これにより、困難な同期状況でのデータセット間の変更と違いの判別が容易になります。
シンクロナイザは、データを更新できる時期と、人間が潜在的な競合を調停する必要がある時期を識別する必要があります。私は ロギングと代数の法則を使用してこれを行う方法を説明する論文 を書きました。
アプリケーションのクライアント側データストアとして最適なものは何ですか? SQLiteのような組み込みデータベース、メッセージキュー、またはオブジェクトストア、または(Webアプリケーションであるためにこれらのどれも使用できない場合)ファイル/ドキュメントをWeb DBまたは IndexedDB HTML 5の LocalStorage APIを介して。
論文をチェックしてください Gold Rush:モバイルトランザクションミドルウェアとJavaオブジェクトレプリケーション 。時々接続されるシステムに関するマイクロソフトのドキュメントには、サービス指向またはメッセージ指向とデータ指向の2つのアプローチが記載されています。ゴールドラッシュは以前のアプローチを採用しています。後者のアプローチでは、データベースのマージレプリケーションを使用します。