由于同时访问网站的用户数量可能非常巨大,从J2EE连接池创建CachedRowSet要比直接创建连接好得多。DataSourceName属性告诉CachedRowSet在JNDI命名空间的什么地方可以找到希望的连接。一旦调用了execute()方法,CachedRowSet就会从JNDI取得一个javax.sql.DataSource的实例。DataSource对象为提供一个到RowSet的JDBC连接。
除了靠CachedRowSet获得一个连接外,还可以将一个现有的连接作为参数传递给execute()方法。清单3中的例子同清单2中一样也是从J2EE连接池获取连接,所不同的是,这次的JNDI查找是显式的:
清单3:通过传递一个现有的连接进行初始化
|
不同应用服务器的连接池JNDI查找名是不一样的。您可以参考您所使用的应用服务器的说明文档,以便给连接池一个合适的JNDI查找模式。
在JSP中显示CachedRowSet 属性
初始化CachedRowSet以后,就可以象java.sql.ResultSet对象一样使用它了。正如先前所指出的,CachedRowSet仅仅是java.sql.ResultSet接口的另外一个实现而已。您可以通过将游标放置在目标行而后使用getString()方法访问CachedRowSet属性(假设对应的数据类型是varchar)。每一种JDBC数据类型都有对应的get方法。如果您不清楚是什么数据类型,您可以使用getObject()来替代。通过索引号或原始的ResultSet指定列:
|
如果您采用象清单1中的方法包含useBean标签的话,您就可以在您的页面的任何位置通过该标签的脚本ID访问CachedRowSet。下面就是如何使用HTML提交表单域显示一个CachedRowSet列的实例:
|
为了获得属性,您可以显示CachedRowSet的其它信息,如当前行号:
|
对于显示CachedRowSet属性来说,Navigation也是很重要的。CachedRowSet支持ResultSet接口所声明的所有navigation命令。甚至包括诸如previous()、first()和last()等新的JDBC 2.0方法。
目前使用的标准JDBC版本是JDBC 1.0,Sun并没有将其JDBC驱动器更新为2.0版本。但是,由于在客户端对数据进行了缓存,CachedRowSet为JDBC1.0提供了前向和后向的滚动能力。这个优越的特性可以让开发者从为记录浏览应用写自己的ResultSet 缓冲对象的困境中解放出来。要从您的JSP中进行导航,仅仅接受请求与响应的命令参数就可以了:
|
每一个导航方法都根据处理的成功与否返回true或false。如果失败了,游标必须返回到有效的位置。可以通过提交按钮发送导航参数:
|
对CachedRowSet执行更新
我最喜欢的CachedRowSet特性是它可以自动完成对数据库的更新操作。熟悉ASP和Microsoft ADO开发的人也许会对这个特性很感兴趣。CachedRowSet可以大大减少开发人员所书写的SQL语句数量,并且在一个操作中就可以完成联合更新。联合更新对只有有限的数据库连接并且可能在连接上产生瓶颈的WEB应用来说非常有用。对大多数CachedRowSet应用来说,您只需要提供初始的SQL查询语句。最少只需要CachedRowSet上的三个方法就可以实现一个更新操作,但这些方法必须按照指定的顺序进行调用。首先,假设游标定位在正确的位置, 调用ResultSet的一个更新方法。这依赖于示例数据库中的列类型,更新可能如下所示:
|
如果需要,您可以在RowSet中为需要的列重复上面的类似代码。
然后,在移动游标位置之前,RowSet必须知道您是否希望提交对当前列的更改:
|
上述代码并没有将更改发送到数据库,而是仅仅将更改缓存到RowSet的缓存区。当用户进行记录更新时,并不需要捆绑数据库连接。用户仅仅在需要将RowSet的所有更新提交给数据库时才需要连接。
第三也是最后一步是调用acceptChanges(),它将所有的更改一起提交给数据库。还是假设您采用清单1中的方法创建的CachedRowSet,下面的代码会提交包括最后一次以前的所有更新操作: