ほとんど使っている人いない気もするけど、OJBのRemovalAwareListがおかしいと思う。削除されたオブジェクトを検出するのにRemovalAware~を使っているのだけど、set(int,Object) で更新されたときをカバーしてない(それってバグだろう)。というわけで、set でオブジェクトを追加すると、DB上で古いオブジェクトが削除されない・・・。というわけで、RemovalAware~をextended して、set メソッドをチェックするようにするクラスを作って、問題回避。
Collections.synchronized~
Collections.synchronizedMap(Map)すると何が起きるのか気になったのでコードを見てみると、インナークラスのSynchronizedMapでラップしている。そのクラスでは、メンバーに受け取ったMapとObject(mutexっていう名前で)を持っている。mutexにはnewするときに自分自身(SynchronizedMapのthis)を渡して、各メソッドの中でsynchronized(mutex)してロック対象にしている。そんで、keySet()とか呼ばれたときには、Synchronized~でラップして、オブジェクトを返す。なるほど、そういうことになっているのね。というわけで、
Map cache = Collections.synchronizedMap(new HashMap()); Collection values = Collections.synchronizedCollection(cache.values());
というようなコードは無駄ですね。
ratproxy
面白そうだな。後で試そう。