JDBC ResultSet / Statement中的Java内存泄漏

时间:2014-03-12 16:51:56

标签: java reflection memory-leaks annotations

我有一个自编的迷你库,应该使用反射和注释来处理MySQL数据库。由于某种原因,我的应用程序使用其代码具有内存泄漏问题。当我对它进行分析时,它检测到char数组的大量内存消耗。任何人都可以解释我的错吗? (导致内存泄漏的函数代码之一)

public List select(Class clazz, String condition, Object... values) throws Exception{
    Table tbl = (Table) clazz.getAnnotation(Table.class);
    if(tbl==null) throw new Exception("Specified class doesnt contain table information");

    StringBuilder strb = new StringBuilder().append("SELECT * FROM `");
    strb.append(prefix).append(tbl.name());
    strb.append("` WHERE ");
    strb.append(condition);

    PreparedStatement stmt = con.prepareStatement(strb.toString());
    for (int i = 0; i < values.length; i++) {
        stmt.setObject(i + 1, values[i]);
    }

    ResultSet rs = stmt.executeQuery();
    ArrayList result = new ArrayList<>();
    while(rs.next()){
        Object o = clazz.newInstance();
        for(Field f : clazz.getFields()){
            Table.Column col = f.getAnnotation(Table.Column.class);
            if(col!=null){
                if(!f.isAccessible())
                    f.setAccessible(true);
                f.set(o, rs.getObject(f.getName()));
            }
        }
        result.add(o);
    }
    return result;
}

提前谢谢你。 PS我没有在此函数返回的List中使用List或元素用于测试目的

1 个答案:

答案 0 :(得分:2)

您必须关闭结果集和声明。