データベースからXML文書のテンプレートを取得し、それを編集して出力するプログラムを作っています。
性能要件のため、「一度取得したXMLはメモリにキャッシュしておき、2回目以降はキャッシュされたXMLを再利用する」仕組みにしています。
public class Entity{
private Element XML;
public Element getXML(){
return XML.cloneNode();
}
public void setXML(Element XML){
this.XML = XML.cloneNode();
}
}
public class Dao{
public Element getXML(){
//DBにアクセスしてXML文書を取得する処理
return XML;
}
}
public class Main(){
private Dao dao;
public void outputXML(Entity entity){
Element XML = entity.getXML;
if (entity == null){
XML = dao.getXML
entity.setXML(XML)
}
//以下XMLを編集して出力する処理
}
}
get時とset時にcloneNodeすることで、保存されたテンプレートは書き換えられない……という事を期待し、実際その処理はうまく行っていたのですが
動作させているうちにメモリリークが発生し、調査してみるとどうやらcloneNodeが実行されるたびに、EntityのフィールドのElementオブジェクトの容量が増加している様子…
一体なぜこのような現象が起きているのでしょうか?
また、これを回避する方法はあるでしょうか。
javaのバージョンは1.6
データベースはOracle Databaseを使用しています
よろしくおねがいします。
お礼
ご回答ありがとうございました。 解消方法はわからなかったため、別の方法を探してみようと思います。