SQLite3を組み込み、インメモリデータベースを使用するアプリケーションで、アプリケーションの2つの実行中のインスタンス間でデータベースを複製することは可能ですか?すべてのDBアクセスを複製する自作プロトコルを使用してこれを手動で行うことはできますが、DBレイヤー内で行う必要があるようです。
ブルートフォースアプローチ:「。dump」コマンドを送信して、データのテキスト表現を作成します。そのデータを2番目のデータベースに読み込みます。あなたがそれを使うことができるかどうかわからない。
きめ細かい更新(それぞれのコピーを他のコピーに送信する)が必要な場合は、 sqlite3_update_hook
しかし、どのようにエラーを処理する予定ですか?たとえば、app2のDBのコピーが何らかの理由で更新できない場合はどうなりますか?
これを解決するには、データベースをサーバープロセスに移動し、2つのアプリがデータベースと通信するようにします。
箱から出して、いいえ。サードパーティのオプションがいくつかあります。
SQLite同期: https://ampliapps.com/sqlite-sync/ これは、SQLiteだけでなく他のデータベースにも複製でき、SQLiteエンジンを変更しないため、魅力的なようです。まだ試していません。
Litereplica: http://litereplica.io/ 一方向のみ。少し周りにあったようです。
LiteSync: http://litesync.io/ 双方向レプリケーション。かなり新しいですが、Litereplicaの進化形なので、おそらく見た目よりも成熟しています。私はこれを少し試しましたが、開発者が見ているいくつかのバグがあり、スムーズに動作しているようです。開発者が変更したSQLiteエンジンを使用する必要がありますが、これは依存関係のようです。また、あまり制御できません。データベースを再度開かずに、今すぐ複製するとは言えません。
Lsyncd-ライブ同期(ミラー)デーモン ここで役立つ場合があります。 rsyncを使用して、ファイルレベルで継続的なレプリケーションを実行します。
インメモリデータベースでのレプリケーションが必要な場合は、 berkeley DB(BDB) を確認する必要があります。ただし、BDBのデータモデルは文字列-文字列ディクショナリであるため、SQLの柔軟性が失われます。さらに、3条項のライセンスがあるため、プロジェクトが商用の場合はライセンスを取得する必要があります。
ユニゾン? SQLiteデータベースが1つのモノリシックファイルに含まれているため、ホットスペアが最善の方法でした。 2つの「インスタンス」間でラウンドロビンを行うことはできませんでした。ホットスペアは悪くありません。簡単ではない手動の介入があるMySQLマスタースレーブまたはアクティブパッシブと比較して、他のアプリとデータベースを手間をかけずに取得するだけです。 MySQLレプリケーションは、unison/rsyncのような差分だけでなく、SQLを渡します。しかし、ユニゾンであなたはマスターマスターを持っています。
いいえ、プロジェクトのスコープが単純なインプロセスデータベースであるためではありません。ただし、データベースは単一のファイルであるため、プレーンファイルのコピー操作やrsyncなどに基づいて独自のレプリケーションスクリプトを作成できます。
SQLiteベースのクライアント/サーバータイプのRDBMSが本当に必要な場合は、 SQLiteDBMS を参照してください。