java数据库,该怎么处理

java数据库
一段代码如下:
public   ResultSet   exec_query(String   sql){
try{
Statement   stat=con.createStatement();
ResultSet   rs=stat.executeQuery( "sql ");
return   rs;
}catch(SQLException   e){
e.printStackTrace();
return   null;
}
}
这段代码封装在一个数据库访问类里,在程序的业务层直接使用ResultSet,然后关闭,Statement没有关闭,几天后程序就会出现out   of   memory异常,有   没可能是这个原因造成的,还有就是,如果不返回ResultSet,返回一个Collection,因为数据量很大,回不回很慢,
持久层咋设计,看了一些hibernat和ibatis感觉慢复杂的~

------解决方案--------------------
通用方法接收一个sql语句 返回一个装有LinkedHashMap的ArrayList集合 其中LinkedHashMap的KEY为数据库字段名 VALUE为该字段的值

public static ArrayList delRes(String sql) {
ArrayList <LinkedHashMap> list = new ArrayList <LinkedHashMap> ();
Connection conn = null;
PreparedStatement stmt = null;
ResultSetMetaData metaData=null;
try {
conn = ConDB.getCon();
stmt = (PreparedStatement) conn.prepareStatement(sql);
ResultSet result = stmt.executeQuery();
metaData=result.getMetaData();
while (result.next()) {
LinkedHashMap v = new LinkedHashMap();
for (int i = 1; i <= metaData.getColumnCount(); i++)
v.put(metaData.getColumnLabel(i),result.getObject(i));
list.add(v);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}