我继承了一个非常奇怪的设计,以前的联系公司用于在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