gpt4 book ai didi

java - CachedRowSet、ResultSetDynaClass 还是其他集合?

转载 作者:行者123 更新时间:2023-12-01 15:24:41 25 4
gpt4 key购买 nike

我正在清理一个做得非常糟糕的大型网络应用程序。我无法一次性完成所有工作,所以我将其分成几个部分。我想做的一件事是实现一个带有接受 SQL 语句然后返回集合的函数的类。我的计划是,一旦解决了这个问题,我就可以寻找一个数据库框架来替换该层,而不会干扰网络应用程序的其余部分。

从模板样式数据库访问函数返回 ResultSet 的一个大问题是,如果不禁用 ResultSet,我就无法关闭连接。

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

我阅读了CachedRowSet上引用的文章,但我担心文章中指出它的使用可能会产生问题,因为将大量结果填充到自身中会占用大量 JVM 内存。

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

如果我使用 ChaedRowSet、ResultSetDynaClass 或 Java Collection 来存储 ResultSet 数据,关闭 ResultSet 后是否会丢失该数据?

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

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

预先感谢您提供任何信息或想法。

最佳答案

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

或者你可以像Myna那样做默认情况下会返回一个“物化”集合,或者采用一个可选的行处理程序,该行处理程序将针对原始结果集执行。在第二种情况下,您可以直接访问 BLOB 之类的内容,这些内容几乎总是需要特殊处理,并且仅填充到集合中是不切实际的,并且您知道 rowHandler 何时完成,以便您可以关闭结果集/连接

更新:

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

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

关于java - CachedRowSet、ResultSetDynaClass 还是其他集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10338992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com