`
laies
  • 浏览: 243668 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

CachedRowSet数据库的断接

    博客分类:
  • Java
阅读更多
快取記憶體行集(Cached Row Set)是 Java™ 1.5 提供的一項新功能,源自 JSR114 的努力。這一新功能使您可以擁有一個可串列化的中斷連接的物件。這意味著您可以連接到資料庫,以結果集的形式取得資料,釋放連接並在本地操縱這些資料,然後恢復連接以完成事務,這樣可以大大減少對連接和伺服器資源的使用。本文展示這一切是如何利用 DB2® Universal Database™ 來實作的,並包含範例代碼。

簡介

應該把資料庫連接看作是一種被應用程式廣泛使用的寶貴資源。尤其是在高流量的 Web 網站中,客戶機應該使用由應用程式伺服器(例如,IBM WebSphere® Application Server)管理的資料庫連接池中的資料庫連接,並在其必要的事務發生之後釋放資料庫連接,這一點很重要。

在許多情況下,事務會話會持續較長一段時間,佔用著資料庫連接,直到完成。過去,Java 程式師一直使用沒有快取記憶體解決方案的 JDBC API。快取記憶體解決方案允許用戶在本地快取記憶體結果集,釋放連接,操縱結果集資料,並在稍後的時間點與資料庫同步。在本文中,我將介紹 javax.sql.RowSet 介面的實作,該實作允許我們實作快取記憶體解決方案。




獲得 RowSet 實作

javax.sql.RowSet 介面是在 J2SE Version 1.4 中引入到 Java 語言的。隨著 Java 2 Standard Edition version 1.5 的發佈,我們將會看到該介面的增強和繫結到語言的介面實作。RowSet 介面是 JSR 114 的結果,JSR 114 勾勒了一個方案,也就是“將表格資料與資料源分隔開……”,從而增加“應用程式的可擴展性和編程模型的靈活性”。我使用 beta 版本的 Tiger (Java 1.5) 來進行開發。如果您使用的是以前版本的 Java,應該嘗試 RowSet 的參考實作,可以 從 Sun Microsystems 下載參考實作。對於我們的例子,我們將利用 CachedRowSet 實作。




您以前看到過 RowSet 實作

本文中突出展示的 CachedRowSetImpl 類別是 javax.sql.Rowset 介面的一個實作。javax.sql.Rowset 擴展了 java.sql.ResultSet 介面。因此,如果您熟悉 javax.sql.ResultSet 介面,我是這樣假設的,那麼您會認出 CachedRowSetImpl 提供的許多方法。java.sql.RowSet 介面提供您在標準 JDBC 2.0 ResultSet 中看到過的所有方法;附加價值是,我們不需要連續使用資料庫連接。就相當於我們可以走進商店,取走商品目錄之後進行挑選,然後再帶著填好的訂單回到商店。




使用 CachedRowSet

CachedRowSet 是一個 JavaBean。您可以通過使用現有的 ResultSet 物件,或者通過指定連接連接資訊和 SQL 查詢,來填滿 CachedRowSet。我們採用後一種方法。但是,首先為我們的沙箱創建一個小的 DB2 資料庫。


db2 => create database cachedex

我假設在您的機器上具有一個叫做 db2admin 的用戶,口令為 db2admin:


db2=> connect to cachedex user db2admin using db2admin

創建一個名為 cachetbl 的表:


db2=> create table cachetbl (id int primary key not null, 
   firstname varchar(40) not null, lastname varchar(40) 
   not null)

然後用以下行填滿該表:


insert into cachetbl values (12345,’Kulvir’,’Bhogal’)

insert into cachetbl values (23456,’Meet’,’Feona’)

insert into cachetbl values (34567,’Bicky’,’Singh’)

我提供的範例代碼建立一個到 DB2 的直接連接。如果您是通過由應用程式伺服器(比如 IBM WebSphere Application Server)管理的池獲得資料庫連接,那麼可以使用 execute 方法的另一種形式,該方法利用 java.sql.Connection 對象作為參數。通過閱讀我的相關主題的文章 Using Data Sources the Right Way,可以更多地瞭解使用資料源 —— 一種 J2EE 最佳實踐。




可串列化

javax.sql.RowSet 的實作可以被串列化。對於處理 Enterprise Java Beans 的程式師來說,這是一個比較好的訊息。標準 JDBC 2.0 ResultSets 是不可串列化的,這使得是否需要使用定制物件,以便 ResultSet 資料可以被發送回 EJB 設定中的客戶機以進行操縱或查詢,成了一個爭論。有了 RowSet 實作的出現,我們就可以串列化 ResultSets,將它們發送到我們的客戶機,然後我們的客戶機可以讀取和更新 ResultSet,並將它發送回伺服器。




可捲動

CachedRowSetImpl 實作是可捲動的,所以允許您在 RowSet 給出的記錄集中向前和向後捲動。這在 JDBC 2.0 ResultSet 中是允許的。但是以前,在捲動發生期間必須維護一個會話。現在,我們可以在離線資料中捲動了。




作一個資料完整性的樂天派

您可能會想,如果在客戶機 A 將更改與資料庫伺服器進行同步之前,客戶機 A 上快取的資料被另一個客戶機(客戶機 B)操縱,那將會發生什麼事情。CachedRowSet 的預設實作不對資料庫伺服器維護鎖。參考實作使用樂觀的同步。具體地說就是,如果客戶機 A 試圖操縱的資料在資料庫伺服器上沒有更改,那麼更新將會被資料庫接受。但是,如果在次期間目標資料被更改,就會拋出一個同步異常。注意,這種樂觀方法也是參考實作處理併發性的方式。其他實作可能採取不同的併發策略;規範並不強制要求使用某個特定的併發模型。




查看起作用的東西

我提供了一個 示例程式,該程式展示了 CachedRowSetImpl 提供的一些功能。這些代碼都可以在檔 DisconnectedExample.java 中找到。我將解釋該程式的一些部分,以便您可以理解我想要傳達的內容。注意,要運行示例應用程式,需要在運行時類別路徑中包含 DB2 Universal JDBC 驅動程式 (db2jcc.jar)。還需要包含 db2jcc_license_cu.jar 文件。關於設定環境的更多資訊,請參考我的文章:Hooking Up with DB2 Universal Database Version 8 using Java


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() + " - " + 
	crs.getString("firstname") + " " + 
	crs.getString("lastname"));
}
System.out.println("---------------------------");

在上面的代碼中,我建立了一個 com.sun.rowset.CachedRowSetImpl 對象。注意我是如何為 CachedRowsetImpl 物件指定資料庫連接資訊的。我用 setCommand 方法來指定想要執行的查詢。當發出 execute 方法時,就會填滿 CachedRowSetImpl 對象。就是在該方法呼叫中,我們獲得然後再關閉資料庫連接。然後我可以在物件中迭代,並使用 getter 方法來抽取和報告其中包含的資料。

正如前面所提到的,CachedRowSetImpl 物件是可捲動的。下面的代碼範例展示了這項功能,我在該代碼中使用 last()previous() 方法在資料間前後捲動。


System.out.println("Showcase scrollability");
// move backwards through rowset
// scroll to last row
crs.last();
// iterate to next row
while (crs.previous())
{
	// report current row contents
	System.out.println(crs.getRow() + " - " + crs.getString("lastname"));
}

方法 first()next() 也可用於在資料間捲動。

為了展示從資料庫中斷連接的能力,範例程式設計為暫停,並讓您實際地執行生動的操作,即停止 DB2,以真正瞭解 CachedRowSet 功能的優勢。在繼續操作(由完成 BufferedReader 物件的一個簡單 readLine 而推動)之前,應用程式等待按下任意鍵。當範例程式提示您停止 DB2 時,可以在一個新的 DB2 命令行處理器視窗中使用下面的命令:


db2 force applications all

然後再使用


db2stop

來強迫 DB2 的停止。

儘管資料庫已經停止,但是下面的代碼必須執行:


System.out.println("Demonstration of how to update cached row set");	
crs.updateString("lastname","Kaur");
// commit changes to cached portion of rowset
crs.updateRow();
System.out.println(crs.getRow() + " - " + crs.getString("lastname"));

在上面的代碼中,我們更改了當前行目錄的 last name 欄位。注意,對 CachedRowSetImpl 物件使用了 updateRow() 方法,以記錄對該物件的更改。在這一時間點,資料庫還沒有被更新。正如您可以回想起的,資料庫 甚至沒有運行。應用程式將提示您啟動 DB2。為此,可以從 DB2 命令行處理器發出下面的命令:


db2start

在 DB2 啟動之後,按任意鍵繼續示例應用程式。

此時,下面的代碼將會運行,這將有效地在資料庫中同步更改。


crs.acceptChanges();

通過對 cachetbl 執行一個選擇查詢,可以確認資料庫實際上已經更新,如 圖 1 所示:


圖 1. 確認更新更改已經與資料庫同步
確認更新更改已經與資料庫同步

為了結束我們對 CachedRowSet 的動手研究,範例應用程式還展示了如何插入和刪除行。要執行插入,必須將游標移動到一個叫做“插入行”的特殊位置。在這裏,我們使用更新方法來填滿新行。當我們使用 insertRow() 方法時,CachedRowSetImpl 物件就會被更新。當執行 acceptChanges() 方法時,更改就被持久地儲存到資料庫中。

以下代碼展示了這一點:


// move the cursor to a blank row 
crs.moveToInsertRow();
// populate the new row
crs.updateInt(1,01234);
crs.updateString(2,"Judith");
crs.updateString(3,"Smith");
// insert the new row
crs.insertRow();
// move cursor back to previous position
crs.moveToCurrentRow();
// synchronize changes to database
crs.acceptChanges();

在插入完成之後程式將會暫停,以允許您在資料庫中查詢插入。

從物件刪除行相當直觀。只需要將游標定位到想要刪除的地方,然後使用 deleteRow 方法即可。跟前面一樣,需要一個後續的同步,以將更改持久儲存到資料庫中:


// delete row (where the cursor is currently positioned)
crs.deleteRow();
// synchronize changes to database
crs.acceptChanges();




只是一種實作

讀者應該注意,javax.sql.RowSet 介面的 CachedRowSetImpl 實作只是一種實作(更確切地說是參考實作)。其他供應商也擁有 RowSet 的實作,這些實作與參考實作處理問題(比如資料完整性)的方式可能會不同(例如,第三方實作可能會對伺服器進行鎖維護)。


 


普遍含義

可更新的“中斷連接的” ResultSets 在普遍世界中具有各種含義,其中,網路連接可以是斷斷續續的。使用 CachedRowSet 可以允許客戶機在連接可用時將資料快取在本地,然後重新連接,以同步對資料執行的更改。




謹慎使用

中斷連接具有其優點。但是用戶必須理解,中斷連接的物件是儲存在記憶體中。因此,不應該使用具有大型結果集的方法。大型結果集的相應更新和捲動會是耗資源的操作。




結束語

與標準 JDBC 2.0 ResultSet 不一樣,利用 CachedRowSet 不再需要連續使用資料庫連接。因為資料庫連接池中的資料庫連接是寶貴的資源,所以連接資料庫、中斷連接,然後重新連接以便同步資料庫,這種能力無疑是非常受歡迎的。

分享到:
评论

相关推荐

    非连接行集在基于Java的B_S系统中的应用.pdf

    但是,在基于Java的B_S数据库应用中,当数据库连接没有关闭时,会出现数据库会话溢出的问题。这是因为大多数使用者在开发JSP程序时,喜欢使用面向连接的行集对象ResultSet,而不是非连接行集对象。 五、传统B_S应用...

    JdbcRowSet.rar_jdbcrowset

    4. **离线操作**:演示在断开数据库连接后,如何在`JdbcRowSet`或`CachedRowSet`上进行增删改操作,例如使用`insertRow()`, `deleteRow()`, `updateRow()`等方法。 5. **同步更新**:介绍如何使用`acceptChanges()`...

    Java数据库编程宝典4

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典3

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    java 数据库编程

    - **行集**:`javax.sql.rowset`包提供了一系列用于离线处理数据的类,如`CachedRowSet`。 - **分布式事务**:在分布式环境中协调多个资源(如数据库和消息队列)的事务管理。 #### 六、应用于JDBC的其他企业API -...

    Java数据库编程宝典2

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    Java数据库编程宝典1

    第1部分 介绍数据库、SQL和JDBC 第1章 关系型数据库 1.1 理解关系型数据库管理系统 1.1.1 关系模型 1.1.2 Codd法则 1.1.3 表、行、列和关键字 1.1.4 主键 1.1.5 外键 1.1.6 关系 1.1.7 视图 1.1.6 范式...

    rowset

    在这个例子中,我们首先建立数据库连接,执行查询,然后创建一个CachedRowSet实例,并用ResultSet填充它。 6. **Rowset与ResultSet的对比** ResultSet是数据库查询的结果集,需要保持与数据库的连接。而Rowset...

    Applet servlet

    在给定的部分内容中,提到了使用`CachedRowSet`来操作数据库。`CachedRowSet`是Sun Microsystems为解决JDBC性能问题而引入的一种技术,它允许在内存中缓存ResultSet数据,从而可以在断开数据库连接的情况下对数据...

    com.sun.rowset.jar.zip

    1. CachedRowSet:提供了一种可以脱离数据库连接的ResultSet实现,数据被缓存在内存中,非常适合于在网络间传输或者在多线程环境中使用。 2. FilteredRowSet:允许在离线状态下对数据进行过滤和排序,增强了数据...

    jdbc_rowset

    JDBC RowSet是Java数据库连接(JDBC)规范的一部分,它提供了一种高效且灵活的方式来处理数据库查询结果。RowSet对象是一个可滚动、可更新的数据集,它可以独立于底层数据库连接存在,这意味着即使在关闭了数据库...

    java的rowset工具包

    1. CachedRowSet:这是最常见的RowSet实现,它可以在断开与数据库连接后保存和修改数据。CachedRowSet将数据存储在内存中,可以进行滚动、查找和编辑,然后再同步回数据库。 2. JdbcRowSet:它与数据库保持实时连接...

    DM8程序员手册.pdf

    - RowSet:介绍了CachedRowSet和JdbcRowSet的使用。 - 分布式事务支持:讲述了如何使用XA数据源、XA连接和XAResource来管理分布式事务。 ### 第5章 .NETDataProvider编程指南 - 数据类型:概述了.NET环境中使用的...

    ROWSET介绍加实例

    1. CachedRowSet:这是最基本的ROWSET实现,它可以完全脱离数据库,支持滚动和遍历。由于数据被缓存,所以对于需要多次访问的结果集特别有用,可以显著减少对数据库的访问次数。 2. JoinRowSet:用于合并多个结果集...

    jdbc-api

    5. **RowSet**家族:JDBC 2.0引入了多种类型游标,如CachedRowSet、JdbcRowSet等,它们是独立于连接的,可以在没有物理连接的情况下处理数据,增强了离线处理能力。 6. **Savepoint**: 支持保存点,可以在事务中设置...

    java 离线数据传送

    下面是一个使用 `CachedRowSet` 的简单示例,该示例演示了如何从 SQL Server 数据库中获取数据,并在关闭数据库连接后继续进行数据处理。 ```java import java.sql.Connection; import java.sql.DriverManager; ...

    oracle10g jdbc 驱动 ocrs12.jar

    这个接口包含了一些预定义的接口和类,如`CachedRowSet`和`WebRowSet`,它们为数据库操作提供了非常灵活和高效的方式。 1. **CachedRowSet**: 这是一个实现了滚动和遍历能力的接口,允许将结果集保存在内存中,即使...

    JDBC知识.doc

    1. 创建RowSet实例,如`CachedRowSet crs = new CachedRowSetImpl();` 2. 设置RowSet的源,通常是ResultSet:`crs.populate(rs);` 3. 断开与数据库的连接,`conn.close();` 4. 在RowSet上进行增删改查操作,如`crs....

    DM7程序员手册

    - **CachedRowSet**:介绍了缓存行集的概念及其使用方法。 - **JdbcRowSet**:解释了JdbcRowSet的特性和应用场景。 - **分布式事务支持**: - **XADataSource**:介绍了如何使用X/Open XA协议实现分布式事务。 -...

    JDBC开发人员指南和参考

    2. **RowSet**: 支持离线处理和缓存,如CachedRowSet,可以在没有连接的情况下操作数据。 3. **JDBC与JPA/EJB结合**: 在企业级应用中,JDBC常与JPA(Java Persistence API)或EJB(Enterprise JavaBeans)一起使用...

Global site tag (gtag.js) - Google Analytics