📄 利用 db2 udb 来使用 java cachedrowset 实现.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0039)http://www.itjc.cn/html_info/176152.htm -->
<HTML><HEAD><TITLE>利用 DB2 UDB 来使用 Java CachedRowSet 实现--IT教程网-itjc.cn-最新、最全的IT资料</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<META
content=IT教程网-itjc.cn-最新、最全的IT资料,程序开发·操作系统·软件应用·图形图象·网络应用·其他整理·论文·精文荟萃·硬件维修·安全技术·关注GOOGLE·QQ专区·图库·娱乐频道
name=description>
<META
content=IT教程网-itjc.cn-最新、最全的IT资料,程序开发·操作系统·软件应用·图形图象·网络应用·其他整理·论文·精文荟萃·硬件维修·安全技术·关注GOOGLE·QQ专区·图库·娱乐频道
name=keywords><LINK href="利用 DB2 UDB 来使用 Java CachedRowSet 实现.files/style.css"
type=text/css rel=stylesheet>
<META content="MSHTML 6.00.2900.3059" name=GENERATOR></HEAD>
<BODY>
<SCRIPT language=javascript
src="利用 DB2 UDB 来使用 Java CachedRowSet 实现.files/top.js"></SCRIPT>
<SCRIPT language=javascript
src="利用 DB2 UDB 来使用 Java CachedRowSet 实现.files/search.js"></SCRIPT>
<TABLE id=table1 cellSpacing=0 cellPadding=0 width=770 align=center border=0>
<TBODY>
<TR>
<TD align=bottom width=658><B>您现在的位置:</B><A
href="http://www.itjc.cn/">IT教程网</A> > <A
href="http://www.itjc.cn/channel.asp?id=1007">其他整理频道</A> > <A
href="http://www.itjc.cn/class.asp?id=635">Java
技术栏目</A></TD></TR></TBODY></TABLE>
<TABLE id=table3 cellSpacing=0 cellPadding=0 width=770 align=center border=0>
<TBODY>
<TR>
<TD vAlign=top width=600>
<TABLE id=table4 cellSpacing=0 cellPadding=0 width=768 border=0>
<TBODY>
<TR>
<TD>
<DIV style="MARGIN-TOP: 5px; TEXT-ALIGN: center">
<SCRIPT
src="利用 DB2 UDB 来使用 Java CachedRowSet 实现.files/wz.js"></SCRIPT>
<P align=center></P></DIV>
<DIV id=div_info_title>利用 DB2 UDB 来使用 Java CachedRowSet 实现</DIV>
<DIV id=div_info_info style="COLOR: #666666; TEXT-ALIGN: center"><A
href="http://www.itjc.cn/">http://www.itjc.cn/</A> 2006-7-19
10:55:27 来源:互连网 </DIV>
<DIV
style="MARGIN-TOP: 15px; MARGIN-BOTTOM: 15px; TEXT-ALIGN: center"></DIV>
<DIV id=div_info_body><SPAN class=atitle2>断开连接</SPAN><BR>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR vAlign=top align=left>
<TD>
<P>级别: 初级</P></TD></TR></TBODY></TABLE>
<P><NAME></NAME>Kulvir Singh Bhogal<BR>IBM Software Services for
WebSphere, IBM Corporation<BR>2004 年 8 月 </P>
<BLOCKQUOTE>高速缓存行集(Cached Row Set)是 Java™ 1.5 提供的一项新功能,源自 JSR114
的努力。这一新功能使您可以拥有一个可串行化的断开连接的对象。这意味着您可以连接到数据库,以结果集的形式取得数据,释放连接并在本地操纵这些数据,然后恢复连接以完成事务,这样可以大大减少对连接和服务器资源的使用。本文展示这一切是如何利用
DB2® Universal Database™ 来实现的,并包含示例代码。</BLOCKQUOTE>
<P><SPAN
class=atitle2>简介</SPAN><BR>应该把数据库连接看作是一种被应用程序广泛使用的宝贵资源。尤其是在高流量的 Web
站点中,客户机应该使用由应用程序服务器(例如,IBM WebSphere® Application
Server)管理的数据库连接池中的数据库连接,并在其必要的事务发生之后释放数据库连接,这一点很重要。</P>
<P>在许多情况下,事务会话会持续较长一段时间,占用着数据库连接,直到完成。过去,Java 程序员一直使用没有高速缓存解决方案的
JDBC
API。高速缓存解决方案允许用户在本地高速缓存结果集,释放连接,操纵结果集数据,并在稍后的时间点与数据库同步。在本文中,我将介绍
<CODE><FONT face=新宋体>javax.sql.RowSet</FONT></CODE>
接口的实现,该实现允许我们实现高速缓存解决方案。 </P>
<P><SPAN class=atitle2>获得 RowSet 实现</SPAN><BR><CODE><FONT
face=新宋体>javax.sql.RowSet</FONT></CODE> 接口是在 J2SE Version 1.4 中引入到
Java 语言的。随着 Java 2 Standard Edition version 1.5
的发布,我们将会看到该接口的增强和绑定到语言的接口实现。 <CODE><FONT
face=新宋体>RowSet</FONT></CODE> 接口是 JSR 114的结果,JSR 114
勾勒了一个方案,也就是“将表格数据与数据源分隔开……”,从而增加“应用程序的可扩展性和编程模型的灵活性”。我使用 beta 版本的
Tiger (Java 1.5) 来进行开发。如果您使用的是以前版本的 Java,应该尝试 RowSet 的参考实现,可以 从 Sun
Microsystems 下载参考实现。对于我们的例子,我们将利用 <CODE><FONT
face=新宋体>CachedRowSet</FONT></CODE> 实现。 </P>
<P><SPAN class=atitle2>您以前看到过 RowSet 实现</SPAN><BR>本文中突出展示的
<CODE><FONT face=新宋体>CachedRowSetImpl</FONT></CODE> 类是 <CODE><FONT
face=新宋体>javax.sql.Rowset</FONT></CODE> 接口的一个实现。 <CODE><FONT
face=新宋体>javax.sql.Rowset</FONT></CODE> 扩展了 <CODE><FONT
face=新宋体>java.sql.ResultSet</FONT></CODE> 接口。因此,如果您熟悉 <CODE><FONT
face=新宋体>javax.sql.ResultSet</FONT></CODE> 接口,我是这样假设的,那么您会认出
<CODE><FONT face=新宋体>CachedRowSetImpl</FONT></CODE> 提供的许多方法。
<CODE><FONT face=新宋体>java.sql.RowSet</FONT></CODE> 接口提供您在标准 JDBC 2.0
ResultSet
中看到过的所有方法;附加价值是,我们不需要连续使用数据库连接。就相当于我们可以走进商店,取走商品目录之后进行挑选,然后再带着填好的订单回到商店。
</P>
<P><SPAN class=atitle2>使用 CachedRowSet</SPAN><BR><CODE><FONT
face=新宋体>CachedRowSet</FONT></CODE> 是一个 JavaBean。您可以通过使用现有的
<CODE><FONT face=新宋体>ResultSet</FONT></CODE> 对象,或者通过指定连接连接信息和 SQL
查询,来填充 <CODE><FONT face=新宋体>CachedRowSet</FONT></CODE>
。我们采用后一种方法。但是,首先为我们的沙箱创建一个小的 DB2 数据库。 </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
db2 => create database cachedex
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>我假设在您的机器上具有一个叫做 db2admin 的用户,口令为 db2admin:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
db2=> connect to cachedex user db2admin using db2admin
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>创建一个名为 cachetbl 的表:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
db2=> create table cachetbl (id int primary key not null,
firstname varchar(40) not null, lastname varchar(40)
not null)
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>然后用以下行填充该表:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
insert into cachetbl values (12345,’Kulvir’,’Bhogal’)
insert into cachetbl values (23456,’Meet’,’Feona’)
insert into cachetbl values (34567,’Bicky’,’Singh’)
</CODE></PRE></TD></TR></TBODY></TABLE>
<P>我提供的示例代码建立一个到 DB2 的直接连接。如果您是通过由应用程序服务器(比如 IBM WebSphere
Application Server)管理的池获得数据库连接,那么可以使用 <CODE><FONT
face=新宋体>execute</FONT></CODE> 方法的另一种形式,该方法利用 <CODE><FONT
face=新宋体>java.sql.Connection </FONT></CODE>对象作为参数。通过阅读我的相关主题的文章
Using Data Sources the Right Way,可以更多地了解使用数据源 —— 一种 J2EE 最佳实践。 </P>
<P><SPAN class=atitle2>可串行化</SPAN><BR><CODE><FONT
face=新宋体>javax.sql.RowSet</FONT></CODE> 的实现可以被串行化。对于处理 Enterprise
Java Beans 的程序员来说,这是一个比较好的消息。标准 JDBC 2.0 <CODE><FONT
face=新宋体>ResultSets</FONT></CODE> 是不可串行化的,这使得是否需要使用定制对象,以便
<CODE><FONT face=新宋体>ResultSet</FONT></CODE> 数据可以被发送回 EJB
设置中的客户机以进行操纵或查询,成了一个争论。有了 <CODE><FONT face=新宋体>RowSet</FONT></CODE>
实现的出现,我们就可以串行化 <CODE><FONT face=新宋体>ResultSets</FONT></CODE>
,将它们发送到我们的客户机,然后我们的客户机可以读取和更新 <CODE><FONT
face=新宋体>ResultSet</FONT></CODE> ,并将它发送回服务器。 </P>
<P><SPAN class=atitle2>可滚动</SPAN><BR><CODE><FONT
face=新宋体>CachedRowSetImpl</FONT></CODE> 实现是可滚动的,所以允许您在 <CODE><FONT
face=新宋体>RowSet</FONT></CODE> 给出的记录集中向前和向后滚动。这在 JDBC 2.0 <CODE><FONT
face=新宋体>ResultSet</FONT></CODE>
中是允许的。但是以前,在滚动发生期间必须维护一个会话。现在,我们可以在离线数据中滚动了。 </P>
<P><SPAN class=atitle2>作一个数据完整性的乐天派</SPAN><BR>您可能会想,如果在客户机 A
将更改与数据库服务器进行同步之前,客户机 A 上缓存的数据被另一个客户机(客户机 B)操纵,那将会发生什么事情。 <CODE><FONT
face=新宋体>CachedRowSet</FONT></CODE>
的默认实现不对数据库服务器维护锁。参考实现使用乐观的同步。具体地说就是,如果客户机 A
试图操纵的数据在数据库服务器上没有更改,那么更新将会被数据库接受。但是,如果在次期间目标数据被更改,就会抛出一个同步异常。注意,这种乐观方法也是参考实现处理并发性的方式。其他实现可能采取不同的并发策略;规范并不强制要求使用某个特定的并发模型。
</P>
<P><SPAN class=atitle2>查看起作用的东西</SPAN><BR>我提供了一个 示例程序,该程序演示了
<CODE><FONT face=新宋体>CachedRowSetImpl</FONT></CODE>
提供的一些功能。这些代码都可以在文件 <CODE><FONT
face=新宋体>DisconnectedExample.java</FONT></CODE>
中找到。我将解释该程序的一些部分,以便您可以理解我想要传达的内容。注意,要运行示例应用程序,需要在运行时类路径中包含 DB2
Universal JDBC 驱动程序 (db2jcc.jar)。还需要包含 db2jcc_license_cu.jar
文件。关于设置环境的更多信息,请参考我的文章: Hooking Up with DB2 Universal Database
Version 8 using Java。 </P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1>
<TBODY>
<TR>
<TD><PRE><CODE>
Class.forName("com.ibm.db2.jcc.DB2Driver");
CachedRowSet crs = new CachedRowSetImpl();
crs.setUsername("db2admin");
crs.setPassword("db2admin");
crs.setUrl("jdbc:db2://localhost:50000/cachedex");
crs.setCommand("SELECT id,firstname,lastname from cachetbl");
crs.execute();
System.out.println("---------------------------");
// display size of cached row set
System.out.println("Size: " + crs.size() + " records");
// display records in cachedrowset
while (crs.next())
{
System.out.println(crs.getRow() + " - " +
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -