我正在清理一个做得很差,很大的webapp。我不能一下子做完所有的事情,所以我把它分成几部分。我想做的一件事是实现一个带有函数的类,这些函数接受SQL语句,然后返回一个集合。我的计划是,一旦解决了这个问题,我就可以到处寻找一个数据库框架来取代这一层,而不会干扰到webapp的其他部分。
在不使用模板式数据库访问函数的情况下返回ResultSet的最大问题是,如果不禁用ResultSet,我就无法关闭连接。
我很兴奋能在这个旧的stackoverflow post中找到建议。
我读了CachedRowSet上引用的那篇文章,但我担心的是,这篇文章指出,使用它可能会产生问题,因为它会将大量结果塞入内存中,从而占用大量内存。
替代的Apache ResultSetDynaClass或任何其他集合不会有同样的问题吗?结果必须以某种方式写入内存。对吗?
如果我使用ChaedRowSet、ResultSetDynaClass或Java Collection来存储ResultSet数据,那么一旦关闭ResultSet,我会丢失这些数据吗?
我已经使用HashMaps来存储来自通用数据库查询函数的单个记录。
我如何使用java Collections来存储多个记录,而不会使代码变得很麻烦?假设我可以,它会比其他两个选项更节省资源或更灵活吗?
提前感谢您提供的任何信息或想法。
发布于 2012-04-27 02:20:51
因为这是一个web应用程序,所以您知道何时需要关闭结果集:在请求结束时。您可以在请求作用域中注册结果集/连接,并在请求结束时将其全部关闭。这就是冷融合(在Java之上运行)处理它的方式。
或者,您可以像Myna一样,在默认情况下返回一个“物化”集合,或者获取一个可选的rowhandler,它将对原始结果集执行。在第二种情况下,您可以直接访问像rowHandler这样的东西,这些东西几乎总是需要特殊处理,并且不适合仅填充到集合中,并且您知道何时完成BLOBs,以便关闭结果集/连接
更新:
以下是请求结束时关闭方法的一个简单示例
public class Query {
static public ConcurrentHashMap openResultSets = new java.util.concurrent.ConcurrentHashMap();
public ResultSet runQuery(String sql) throws SQLException{
//set up connection, run query
ResultSet rs = statement.executeQuery();
if (Query.openResults.get(Thread.currentThread().getId()) == null){
Query.openResults.put(Thread.currentThread().getId(),new Vector())
}
Vector openRS = (Vector) Query.openResults.get(Thread.currentThread().getId())
openRs.add(rs);
return rs;
}
public void onRequestEnd(String sql) {
Vector openRS = (Vector) Query.openResults.get(Thread.currentThread().getId());
if (openRS != null){
for (ResultSet rs : openRS.values()){
try{
rs.close();
} catch(Exception e){}
}
}
//do any other request end cleanup of connections, etc
}
}
//in your servlet
public class Query extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
ResultSet rs = Query.runQuery("select * from AWESOME");
//do awesome stuff, maybe load other classes that can run runQuery
Query.onRequestEnd();
}
}这不是很理想,但我不知道您使用的是什么框架。通过setAttribute()/getAttribute()将它保存在HttpServletRequest对象中可能是有意义的,但这需要将请求传递给使用它的每个方法。无论采用哪种方法,您只需要保留一个打开的结果集数组,并在请求结束时关闭它们。使用某种形式的框架会让这件事变得容易得多。
https://stackoverflow.com/questions/10338992
复制相似问题