2012-04-26 73 views
0

我在清理完成的很差,大,web应用。我无法一次完成所有事情,所以我正在把它分解。有一两件事我想这样做是实现与采用SQL语句,然后返回一个集合函数的类。我的计划是,一旦被照顾,我可以货比三家数据库的框架,以取代层,而不会干扰Web应用程序的其余部分。CachedRowSet的,是ResultSetDynaClass或其他集合?

的大问题,返回一个结果出来模板风格的数据库访问功能的是,我不能关闭而没有禁止的ResultSet的连接。

我很兴奋地发现这个老stackoverflow post的建议。

我读过CachedRowSet上引用的文章,但是我担心文章中提到它的使用可能会通过将大量结果填充到自身中来吸引大量JVM内存而产生问题。

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

如果我用ChaedRowSet,是ResultSetDynaClass或Java集合来存储数据结果集,我会丢失数据,一旦我关闭了ResultSet的?

我用包含HashMap存储从通用数据库查询功能单一记录。

我如何使用Java集合来存储多个记录没有代码越来越繁琐?假设我可以,比其他两种方案更有效率或更灵活吗?

感谢您的任何资料或意见。

回答

1

因为这是一个网络应用程序,所以您知道何时需要关闭结果集:请求结束时。您可以在请求范围内注册您的结果集/连接,并关闭它们都在请求结束。这就是Cold Fusion(在Java之上运行)处理它的方式。

或者你可以像Myna那样做,并默认返回一个“实体化”集合,或者采用一个可选的行处理器,它将针对原始结果集执行。在第二种情况下,您可以直接访问像BLOB这样的东西,这些东西几乎总是需要特殊处理,并且不适合填入集合中,并且您知道rowHandler何时完成,因此您可以关闭结果集/连接

UPDATE:

这里是近距离时请求末端方法

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对象中可能是有意义的,但这需要将请求传递给每个使用它的方法。无论哪种方式,您只需保留一组打开的结果集,并在请求结束时关闭它们。使用某种框架可以让这个过程更容易。

+0

你写的所有内容对我来说都是100%新的,所以我不明白你说的一个字。你提到的第一种方法听起来是最可取的。你能发布一个例子和描述的链接吗? – Steve 2012-04-26 19:09:35

相关问题