我繼承了一個非常奇怪的設計,以前的聯繫公司用於在Java中實現DAO。我相信這是我不斷得到PermGen錯誤的原因,但希望看到別人的想法。PermGen錯誤的奇怪的DAO設計原因?
每個DAO都有一個或多個私有靜態final字段。這些是Table類型。表是一個抽象類。每個表的實現都是在線實施的。在靜態塊中,這些實現被放入靜態哈希映射中。
是否有可能由於OBJ_MAP包含Table類的實現,這可能導致ClassLoader永遠無法被垃圾收集?
import java.sql.Types;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyDAO {
private static final Table DESCRIPTION = new TableImpl("MYDESC", Types.VARCHAR);
private static final Table CODE = new TableImpl("MYCODE", Types.VARCHAR);
private static final Map<Table, String> OBJ_MAP = new HashMap<Table, String>();
static {
OBJ_MAP.put(DESCRIPTION, "description");
OBJ_MAP.put(CODE, "code");
}
@SuppressWarnings("unchecked")
public List<BusinessType> getAllBusinessTypes() {
return DAOUtil.executeObjectSelect("Select MYDESC, MYCODE,
from MYTABLE", BusinessType.class,
OBJ_MAP, new BusinessType());
}
}
OBJ_MAP保存Table的實例,而不是其定義(即Class對象)。如果你能提供更多的細節,這將會更有幫助。例如,你觀察到什麼異常行爲,以及觀察它時執行什麼代碼? – dacongy
「每個表的實現都是在線實現的」。不在示例代碼中,它們不是。 –
啊,你是對的。我認爲這是奇怪的語法。表是一個抽象類,所以我認爲這個類是內聯的。我忽略了最後沒有{},並且沒有看到TableImpl類。 – aglassman