普及率は、バイナリシリアル化と先行書き込みログに基づいて、メモリ内オブジェクトモデルにACIDプロパティを提供する簡単な手法です。それはこのように動作します:
- スナップショットから始めます。オブジェクトモデルをシリアル化し、ファイルに書き込みます。
- ジャーナルファイルを作成します。オブジェクトモデルへの呼び出しごとに、呼び出しとその引数をシリアル化します。
- ジャーナルが大きくなりすぎた場合、シャットダウンしている場合、またはその他の理由で便利な場合は、チェックポイントを実行します。新しいスナップショットを書き込み、ジャーナルを切り捨てます。
- クラッシュまたはパワーヒットからロールバックまたは回復するには、最後のスナップショットをロードし、ジャーナルに記録されたすべての呼び出しを再実行します。
この作業を行うために必要な予防策は次のとおりです。
- 可変オブジェクト参照をエスケープさせたり、普及層に入れたりしないでください。RPCを実行しているかのように、何らかのプロキシまたはOIDスキームが必要です。(これは初心者によくある間違いであり、「洗礼問題」と呼ばれています。)
- 呼び出しから到達可能なすべてのロジックは完全に確定的でなければならず、ビジネスロジックにとって意味のあるI / OまたはOS呼び出しを実行してはなりません。診断ログへの書き込みはおそらく問題ありませんが、システム時刻を取得したり、非同期デリゲートを起動したりすることは、通常はできません。これは、別のマシンまたは別の時間に復元された場合でも、ジャーナルがまったく同じように再生されるようにするためです。(ほとんどの普及コードは、トランザクションのタイムスタンプを取得するための代替時間呼び出しを提供します。)
- ライターの並行性は、ジャーナルの解釈にあいまいさをもたらすため、禁止されています。
それは...
- 人々はそれにあまり適していない*プロジェクトにそれを使用しようとした後、彼らのために悪い味を開発しましたか?
- クラウス・ヴエステフェルトの激しい支持 は人々を止めましたか?
- 命令型プログラミングモデルが好きな人は、I / Oを計算から分離することを嫌い、代わりに計算をI / Oおよびスレッド呼び出しでインターリーブすることを好みますか?
- 普及層は概念的にシンプルで、フレームワークの特性に密接に結びついているため、通常はプロジェクト用にカスタムロールされ、それにより、異質/非標準/危険なものになりますか?
- あなたがやらないように注意しなければならないことをまっすぐに保つのはあまりにも難しいですか?
- 初心者は、学校で書くことを学んだ2層データベース駆動型アプリとは異なるものに直面すると、爆発するように見えるだけですか?;)
* RAM内データセット全体のフィットは、あなたは作家の同時実行を必要としない、とあなたは、データウェアハウスに、アドホッククエリ、レポート、またはエクスポートを行う必要はありません。SQLiteへの謝罪により、普及は保存ファイルの改善であり、Oracleの代替ではありません。