首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CachedRowSet、ResultSetDynaClass或其他集合?

CachedRowSet、ResultSetDynaClass或其他集合?
EN

Stack Overflow用户
提问于 2012-04-27 02:09:25
回答 1查看 631关注 0票数 0

我正在清理一个做得很差,很大的webapp。我不能一下子做完所有的事情,所以我把它分成几部分。我想做的一件事是实现一个带有函数的类,这些函数接受SQL语句,然后返回一个集合。我的计划是,一旦解决了这个问题,我就可以到处寻找一个数据库框架来取代这一层,而不会干扰到webapp的其他部分。

在不使用模板式数据库访问函数的情况下返回ResultSet的最大问题是,如果不禁用ResultSet,我就无法关闭连接。

我很兴奋能在这个旧的stackoverflow post中找到建议。

我读了CachedRowSet上引用的那篇文章,但我担心的是,这篇文章指出,使用它可能会产生问题,因为它会将大量结果塞入内存中,从而占用大量内存。

替代的Apache ResultSetDynaClass或任何其他集合不会有同样的问题吗?结果必须以某种方式写入内存。对吗?

如果我使用ChaedRowSet、ResultSetDynaClass或Java Collection来存储ResultSet数据,那么一旦关闭ResultSet,我会丢失这些数据吗?

我已经使用HashMaps来存储来自通用数据库查询函数的单个记录。

我如何使用java Collections来存储多个记录,而不会使代码变得很麻烦?假设我可以,它会比其他两个选项更节省资源或更灵活吗?

提前感谢您提供的任何信息或想法。

EN

回答 1

Stack Overflow用户

发布于 2012-04-27 02:20:51

因为这是一个web应用程序,所以您知道何时需要关闭结果集:在请求结束时。您可以在请求作用域中注册结果集/连接,并在请求结束时将其全部关闭。这就是冷融合(在Java之上运行)处理它的方式。

或者,您可以像Myna一样,在默认情况下返回一个“物化”集合,或者获取一个可选的rowhandler,它将对原始结果集执行。在第二种情况下,您可以直接访问像rowHandler这样的东西,这些东西几乎总是需要特殊处理,并且不适合仅填充到集合中,并且您知道何时完成BLOBs,以便关闭结果集/连接

更新:

以下是请求结束时关闭方法的一个简单示例

代码语言:javascript
复制
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对象中可能是有意义的,但这需要将请求传递给使用它的每个方法。无论采用哪种方法,您只需要保留一个打开的结果集数组,并在请求结束时关闭它们。使用某种形式的框架会让这件事变得容易得多。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10338992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档