使用CachedRowSet实现数据库的断接目前通过网络(物理连接的或无线的)访问数据库存在的主要问题是,无法保证与数据库的连接在任何时候都没有中断。由于其它资源的限制,即使可以获得可靠的数据库连接,也存在着如何合理地使用这些连接的问题。直到最近的一段时间,解决这些问题的唯一途径仍然是那些需要解决这一问题的Java高手自己动手开发一个缓冲区管理层。 本文介绍一个新的使用JDBC 2.0的类,它可以简化数据库访问代码、降低使用JDBC的连接数并且能够提供JDBC 1.0结果集所不能提供的结果集滚动。这个类可以从Sun的早期数据库访问版本获得,它由三个JDBC RowSet接口的实现构成。我们这里只介绍其中的一个——CachedRowSet——用来作为简单JSP应用(就是使用Enterprise JavaBeans有些大材小用时)的数据模型。 可以把CachedRowSet看成是断接的(disconnected)结果集(ResultSet)。它是javax.sql.RowSet的一个早期实现,由于javax.sql.RowSet是java.sql.ResultSet接口的扩展,您可能已经对其大部分方法很熟悉了。RowSet从JavaBeans组件对象模型的角度支持JDBC API。它提供了标准JDBC 2.0 ResultSet所具有的所有方法和特性,但并不需要持续使用数据库连接。象其它JavaBean一样,javax.sql.RowSet的实现也可以被串行化。这样,就可以将ResultSets串行化而后发送给远程客户端,进行更新操作后在发送回服务器。 CachedRowSet的发布已经有一段时日了,因为现在已经有很多WEB开发者对Microsoft的ActiveX Data Objects (ADO)一类的可更新结果集非常熟悉了。很多条目/更新(entry/update)表单需要提供在一个记录集上进行向后和向前滚动的能力。在理想情况下,用户仅仅在缓冲状态下的结果集进行更新而后通过存储命令一次性将所有更新结果存储在数据库中。虽然JDBC 2.0 ResultSet接口支持这种类型的滚动,但用户浏览记录时需要每一个会话都维护与数据库的一个开放连接。为了最大限度地利用数据库资源,您应该在绝对需要时才使用数据库连接。在暂时不需要数据库连接时,应该尽快将其释放回连接池。CachedRowSet提供了这种伸缩性,它仅仅在执行查询和更新时才需要一个数据库连接。 我预计javax.sql.RowSet的第三方实现会很快出现,但与此同时,对于想熟悉新的J2EE平台javax.sql.RowSet接口的开发者而言,CachedRowSet是很有用的。 目前您可以从Java开发者连接(http://developer.java.sun.com/developer/earlyAccess/crs) 下载CachedRowSet的实现。下载并解压缩安装文件后,将"rowset.jar"文件放到您的类目录下。CachedRowSet在sun.jdbc.rowset包中。 创建一个CachedRowSet CachedRowSet事实上是一个JavaBean。它支持允许自身连接一个数据库并获取数据的属性。下面的表格描述了需要在没有预先存在数据库连接的情况下初始化CachedRowSet的一些属性: 属性 描述 Username Database的用户名 Password Database的用户口令 URL Database JDBC URL如:jdbc:odbc:mydsn Command SQL查询语句 CachedRowSet数据库连接属性 因为是JavaBean,所以在创建新的CachedRowSet对象实例时可以简单地使用却省的构造器:
一旦已经创建了这个实例,就可以通过调用其属性设置方法来初始化这个bean。CachedRowSet是一个bean的事实使得在JSP中使用它也非常地方便。要在JSP中创建一个CachedRowSet的实例,使用标准的JSP useBean标签就可以了。UseBean标签会创建一个新的实例,这个实例会作为一个会话(session)值放置在相应的session中并且作为一个脚本变量供JSP进行处理。您可以通过很多方法在useBean标签中对CachedRowSet进行初始化。其中一些方法依赖于您的应用服务器是否具有连接池功能,而另外一些则仅仅需要JDBC 1.0驱动器。清单1说明了在JSP页面中创建和初始化CachedRowSet的一个最明了的方法: 清单1:简单明了的CachedRowSet初始化方法
当已经使用上述方法完成创建时,CachedRowSet会在需要的时候获得自己的数据库连接。在useBean的开始和结束标签之间的 Java代码小脚本(scriptlet)仅仅在useBean第一次将这个bean放置在会话中时执行一次。由于CachedRowSet已经在session中了,随后的页面访问会跳过useBean标签和其中包含的内容。 对于具有J2EE连接池支持的JSP容器来说,可以使用dataSourceName属性代替用户名、密码和URL属性的设置。如果设置了dataSourceName,CachedRowSet会试图从JNDI获得一个连接而不是单独创建一个。这种情况需要编写的代码就更少了,因为应用服务器的连接池已经为您建立了连接。 清单2:从一个J2EE连接池进行初始化
|