私は、実行時に「オブジェクト モデル」を変更して、トランザクションを透過的に実行できるようにするバイトコード エンハンサーを少なくとも 2 つ知っています。そのうちの 1 つは、私が毎日仕事で使用している Versant VOD の一部であり、もう 1 つは Terracotta の一部です。たとえばORMなど、他にもかなりの数があると思いますが、私の会社ではVersantがそれを処理しています。
私の質問は、設計された製品とは関係なく、それ自体で使用できるオープンソース API はありますか? 「ハッキング可能な」API と言えます。コードを大幅に遅くする読み取りアクセスではなく、変更のみを追跡する必要があります。言い換えれば、明示的な読み取り/書き込みロックを必要とすべきではありません。これには、データ モデルだけでなく、変更を実行するすべてのクラスへのアクセスが必要になるか、比較を行うためにメモリ内に何らかの形式の「前のバージョン」を保持する必要があります。
私が解決しようとしている問題は、(NoSQL) DB で「シリアル化」された「大きな」(32K から 256K) オブジェクト グラフがあることです。それらは長寿命であり、変更の「履歴」を保持するために定期的に再シリアル化する必要があります。ただし、シリアル化にはかなりのコストがかかり、ほとんどの変更はマイナーです。
毎回それらを完全にシリアライズし、ストリームでバイナリ差分を実行することはできましたが、CPU を非常に集中的に使用しているように思えます。より良い解決策は、モデルの書き込み操作を変更して変更をプロトコル化する API です。これにより、最初の「イメージ」が保存された後、プロトコルのみを保存する必要があります。
オブジェクトを比較するために Apache Commons Beanutils について話している質問をいくつか見つけましたが、それはインプレース変更には役に立ちません。すべての「ビジネス トランザクション」の間にモデルの完全なクローンを作成する必要があります。
繰り返しますが、私は同じ JVM 内で、外部サーバー アプリケーションを一切使用しない「インメモリ」API を探しています。ネイティブ コードを含む API は、Win、Mac、Linux で使用できる場合は問題ありません。API は現在、個別にパッケージ化する必要はありません。「親プロジェクト」からそれを抽出して、独立した API を形成できる必要があります (親プロジェクトのライセンスでこれが許可されている必要があります)。
オブジェクト グラフには多くの大きな配列が含まれるため、効率的にサポートする必要があります。
変更は、監査のためだけではなく、再生または元に戻すことができるようにするために必要です。より正確には、デシリアライズされた初期グラフと変更のリストを使用して、同一の最終グラフに到達する必要があります。また、終了グラフから始めて、変更を逆に適用することで最初のグラフに戻ることができるはずです。これはまったく同じ機能を使用しますが、変更プロトコルが新しい値に加えて古い値を保持する必要があります。
API ライセンスは、商用利用と互換性がある必要があります。
[編集] これまでのところ、有用な回答が得られていません。私が望むものが存在するようには見えません。残された選択肢は 1 つだけです。それを実現することです。これは私のプロジェクトの次のステップであり、それなしでは先に進むことができないため、実装が機能するようになったら、ここにリンクを回答として投稿します。
[編集] このやや関連する質問を偶然見つけました: Is there a Java library that can "diff" two Objects?