快速业务通道

Java 6 RowSet使用完全剖析 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

Java 6 RowSet使用完全剖析(5)

时间:2011-02-15 IBM 徐睿智 刘威

事务

事务对于保证数据的一致性是非常重要的。CachedRowSet 专门提供了处理事务的接口,从而可以保证同步数据的原子性和一致性。CachedRowSet 默认是不使用事务的。

清单 9. 事务代码一

cachedRS.absolute(1); // 第一列不能为 null,更新时将产生冲突 cachedRS.updateNull(1); cachedRS.updateRow(); cachedRS.next(); cachedRS.updateString(2, "Terry"); cachedRS.updateRow(); try {   cachedRS.acceptChanges(conn); } catch (SyncProviderException e) {   // expected } rs = stmt.executeQuery(DBCreator.SQL_SELECT_CUSTOMERS); cachedRS = new CachedRowSetImpl(); cachedRS.populate(rs); printRowSet(cachedRS);

我们更新了 cachedRS 的第一行和第二行,并将第一行第一列错误的设置为 null。由于 CachedRowSet 默认不使用事务,第一行没有更新,而第二行更新成功。我们也可以手动控制事务的作用范围。

清单 10. 事务代码二

cachedRS.absolute(1); cachedRS.updateNull(1); cachedRS.updateRow(); cachedRS.next(); cachedRS.updateString(2, "Terry"); cachedRS.updateRow(); conn.setAutoCommit(false); try {   cachedRS.acceptChanges(conn);   cachedRS.commit(); } catch (SyncProviderException e) {   // expected   cachedRS.rollback(); } conn.setAutoCommit(true); rs = stmt.executeQuery(DBCreator.SQL_SELECT_CUSTOMERS); cachedRS = new CachedRowSetImpl(); cachedRS.populate(rs); printCachedRowSet(cachedRS);

与前面的例子不同的是,这里我们关闭了自动提交模式,并且在同步失败后回滚了事务,避免了数据不一致的情况。

需要注意的是,如果需要手动控制事务的范围,在调用 execute 或 acceptChanges 时必须传入 Connection,否则再调用 CachedRowSet 的 commit() 或 rollback() 会抛 NullPointerException。实际上 CachedRowSet 依然是通过在内部保存 Connection 的引用来实现事务操作的。

Java 6 RowSet使用完全剖析(6)

时间:2011-02-15 IBM 徐睿智 刘威

分页

由于 CachedRowSet 是将数据临时存储在内存中,因此对于许多 SQL 查询,会返回大量的数据。如果将整个结果集全部存储在内存中会占用大量的内存,有时甚至是不可行的。对此 CachedRowSet 提供了分批从 ResultSet 中获取数据的方式,这就是分页。应用程序可以简单的通过 setPageSize 设置一页中数据的最大行数。也就是说,如果页大小设置为 5,一次只会从数据源获取 5 条数据。下面的代码示范了如何进行简单分页操作。(分页部分代码默认 ORDERS 表中有 10 条数据)

清单 11. 分页代码一

ResultSet rs = stmt.executeQuery(DBCreator.SQL_SELECT_ORDERS); CachedRowSet cachedRS = new CachedRowSetImpl(); // 设置页大小 cachedRS.setPageSize(4); cachedRS.populate(rs, 1); while (cachedRS.nextPage()) { printRowSet(cachedRS); } while (cachedRS.previousPage()) {   printRowSet(cachedRS); }

可以看到只需要在 populate 之前使用 setPageSize 设置页的大小,就可以轻松实现分页了。每次调用 nextPage 或 previousPage 进行翻页后,行游标都会被自动移动到当前页第一行的前面,并且只能在当前页内移动。这样我们对每一页都可以像新的数据集一样进行遍历,非常方便。这里需要注意的是:

用来填充 CachedRowSet 的 ResultSet 必须是可滚动的(Scrollable)。

populate 必须使用有两个参数的版本,否则无法进行分页。读者可以将 cachedRS.populate(rs, 1); 换成 cachedRS.populate(rs); 看看会有

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号