- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在清理一个做得非常糟糕的大型网络应用程序。我无法一次性完成所有工作,所以我将其分成几个部分。我想做的一件事是实现一个带有接受 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/
我正在使用CachedRowSet。但是当我调用 insertRow() 方法时,出现 SQLException failed to insert row。 这是我的代码: static final
我想对两个 CachedRowSet 执行左连接。好像 JoinRowSetImpl 只支持 INNER JOIN 。我可以用什么来让左连接工作? 感谢和问候。 最佳答案 似乎以这种方式重建 Join
我正在开发一个应用程序,我的应用程序将从其他源以分隔格式(原始数据)获取数据,然后我需要将原始数据转换为结果集或缓存行集,然后我将构建的结果集/缓存行集传递给客户端应用程序(它调用我的应用程序来获取数
我想编写一个 java 函数,它接受一个 SQL 查询并返回一个 ResultSet 以供在别处处理。这无法完成,因为一旦连接关闭,ResultSet 就会失效。 谷歌搜索我发现了一个 VERY OL
我正在清理一个做得非常糟糕的大型网络应用程序。我无法一次性完成所有工作,所以我将其分成几个部分。我想做的一件事是实现一个带有接受 SQL 语句然后返回集合的函数的类。我的计划是,一旦解决了这个问题,我
我正在使用 CachedRowSetImpl,我可以从数据库中获取数据,但无法插入。 这是代码: public class NewClass { static final String DAT
我有以下 Java 7 代码来创建 CachedRowSet。 CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();
我正在从可能发生变化的 View 中查询数据。在执行 crs.get******() 之前,我需要知道该列是否存在。 我发现我可以像这样查询元数据,在我从中请求数据之前查看列是否存在: ResultS
我正在使用 MySQL 数据库,我有一个包含 2 列的 Employee 表:Id(Int;主键)和 Name(String ).我已经编写了一些代码来向 Employee 表中插入一行,但是 acc
考虑以下代码片段: public void getUsers() { CachedRowSet rowSet = new CachedRowSetImpl(); .........
直到今天,我在处理查询结果时一直使用 ResultSet。但是今天我读了一些关于RowSet的内容和 CachedRowset我意识到它们可以更好地服务于我的目的。虽然在我阅读的所有示例中,RowSe
我正在使用我在代码中传递的javax.sql.rowset.CachedRowSet对象。在将 CachedRowSet 传递给我的代码的其余部分之前,填充它的 ResultSet 被关闭(仅用于阅读
我正在尝试通过jdbc类型4(microsoft jdbc 3.0)将图像文件(.png,200KB)插入Sql服务器(列类型varbinary(max)),这是我的代码: c
代码: OracleCachedRowSet rowSet = new OracleCachedRowSet(); ResultObject obj = new Resu
在我的 java 代码中,我使用 select 语句访问 oracle 数据库表。我收到很多行(大约 50.000 行),因此 rs.next() 需要一些时间来处理所有行。 using Result
我有一个 Derby SQL 数据库,其中有一个表,其中包含需要包含序列化对象的 blob 字段。我通过 JDBC 访问它。问题是,当我使用 ResultSet 反序列化对象时,一切正常,但如果我使用
我试图将一行插入到具有 CachedRowSet 增量 id 的表中(我正在使用 Java wit Java DB),但出现以下 SQLException: java.sql.SQLException
我很困惑什么是jdbcRowSet、CachedRowSet和WebRowSet。请给我最佳答案。 最佳答案 请参阅下面的所有三个示例。我想你会清楚地了解这些 RowSet接口(interface)。
我正在尝试使用 CachedRowSet 编写一个方法来执行 SQl 查询。示例代码如下(之前定义了用户和密码), public CachedRowSet getContentsOfCoffeesTa
我需要使用 CachedRowSet 或任何其他可能的方式复制 ResultSet 的帮助。我现在就在这个阶段 ResultSet rs = stmt.executeQuery(query); Cac
我是一名优秀的程序员,十分优秀!