?? cachedrowset.htm
字號:
對象在內存中存儲數據,所以它在任一時間可以包含的數據量是由可用的內存量決定的。要避開此限制,<CODE>CachedRowSet</CODE>
對象可以數據塊(稱為<I>頁</I>)的形式從 <CODE>ResultSet</CODE> 對象中檢索數據。要利用此機制,應用程序應使用方法
<CODE>setPageSize</CODE> 設置一頁中要包括的行數。換句話說,如果頁大小設置為 5,則一次從數據源中獲取一個 5
行的數據塊。應用程序也可選擇設置一次可獲取的最大行數。如果最大行數設置為 0,或者未設置最大行數,則對一次獲取的行數沒有限制。
<P>設置各個屬性后,必須使用方法 <CODE>populate</CODE> 或方法 <CODE>execute</CODE> 用數據填充
<CODE>CachedRowSet</CODE> 對象。以下代碼行演示了如何使用方法
<CODE>populate</CODE>。注意,該方法的這種形式采用兩個參數,<CODE>ResultSet</CODE> 句柄和
<CODE>ResultSet</CODE> 對象中的行,從該行開始檢索各行。 <PRE> CachedRowSet crs = new CachedRowSetImpl();
crs.setMaxRows(20);
crs.setPageSize(4);
crs.populate(rsHandle, 10);
</PRE>運行此代碼時,將使用 <I>rsHandle</I> 中從第 10 行開始的 4 行數據填充 <I>crs</I>。
<P>下一個代碼片斷展示了如何使用方法 <CODE>execute</CODE> 填充 <CODE>CachedRowSet</CODE> 對象,該方法可以采用
<CODE>Connection</CODE> 對象作為一個參數,也可以不采用。此代碼向 <CODE>execute</CODE> 傳遞
<CODE>Connection</CODE> 對象 <I>conHandle</I>。
<P>注意,以下代碼片斷和上述代碼片斷有兩處差別。首先,沒有調用方法 <CODE>setMaxRows</CODE>,所以沒有對 <I>crs</I>
可以包含的行數設置限制。(記住,對于 <I>crs</I> 在內存中可以存儲的數據量,總是有一個最高限制。)第二個差別是不能向方法
<CODE>execute</CODE> 傳遞 <CODE>ResultSet</CODE> 對象中起始檢索行的行號。此方法始終從第一行開始檢索。 <PRE> CachedRowSet crs = new CachedRowSetImpl();
crs.setPageSize(5);
crs.execute(conHandle);
</PRE>運行此代碼后,<I>crs</I> 將包含由 <I>crs</I> 的命令所生成的 <CODE>ResultSet</CODE> 對象中的 5
行數據。<I>crs</I> 的 writer 將使用 <I>conHandle</I> 連接數據源并執行 <I>crs</I> 的命令。然后應用程序就能夠在
<I>crs</I> 中的數據上進行操作,方式與在任何其他 <CODE>CachedRowSet</CODE> 對象的數據上進行操作的方式相同。
<P>要訪問下一頁(數據塊),應用程序可調用方法 <CODE>nextPage</CODE>。此方法創建新的 <CODE>CachedRowSet</CODE>
對象并用下一頁的數據填充。例如,假定 <CODE>CachedRowSet</CODE> 對象的命令返回一個具有 1000 行數據的
<CODE>ResultSet</CODE> 對象 <I>rs</I>。如果頁大小設置為 100,則首次調用方法 <CODE>nextPage</CODE>
將創建一個包含 <I>rs</I> 前 100 行的 <CODE>CachedRowSet</CODE> 對象。在使用這前 100
行的數據執行完所需的操作后,應用程序可以再次調用方法 <CODE>nextPage</CODE> 創建另一個帶有 <I>rs</I> 第二個 100 行數據的
<CODE>CachedRowSet</CODE> 對象。第一個 <CODE>CachedRowSet</CODE>
對象中的數據不再存在于內存中,因為它已被第二個 <CODE>CachedRowSet</CODE> 對象的數據替換了。調用方法
<CODE>nextPage</CODE> 10 次后,第十個 <CODE>CachedRowSet</CODE> 對象將包含 <I>rs</I> 最后 100
行存儲在內存中的數據。在任意給定時間,內存中僅存儲一個 <CODE>CachedRowSet</CODE> 對象的數據。
<P>只要當前頁不是各行的最后一頁,方法 <CODE>nextPage</CODE> 就返回 <CODE>true</CODE>,沒有其他頁時,則返回
<CODE>false</CODE>。因此,可在 <CODE>while</CODE> 循環中使用它來檢索所有頁,正如在以下代碼行中所演示的。 <PRE> CachedRowSet crs = CachedRowSetImpl();
crs.setPageSize(100);
crs.execute(conHandle);
while(crs.next() {
. . . // operate on first chunk of 100 rows in crs, row by row
}
while(crs.nextPage()) {
while(crs.next()) {
. . . // operate on the subsequent chunks (of 100 rows each) in crs,
// row by row
}
}
</PRE>運行此代碼片斷后,應用程序會遍歷所有 1000 行,但是每次內存中的數據只有 100 行。
<P><CODE>CachedRowSet</CODE> 接口還定義了方法 <CODE>previousPage</CODE>。正如方法
<CODE>nextPage</CODE> 類似于 <CODE>ResultSet</CODE> 方法 <CODE>next</CODE>,方法
<CODE>previousPage</CODE> 也類似于 <CODE>ResultSet</CODE> 方法
<CODE>previous</CODE>。與方法 <CODE>nextPage</CODE> 類似,<CODE>previousPage</CODE>
創建一個 <CODE>CachedRowSet</CODE> 對象,包含作為頁大小設置的行數。因此,(舉例來說)方法
<CODE>previousPage</CODE> 可用在上述代碼片斷末尾的 <CODE>while</CODE>
循環中,以從最后一頁開始逆向遍歷到第一頁。方法 <CODE>previousPage</CODE> 也與 <CODE>nextPage</CODE>
類似,因為它也可以用在 <CODE>while</CODE> 循環中,不同之處在于它是在前面還有頁時返回 <CODE>true</CODE>,前面沒有頁時返回
<CODE>false</CODE>。
<P>通過將指針定位于每頁最后一行的后面(如以下代碼片斷所執行的),方法 <CODE>previous</CODE>
就可以在每頁中從最后一行遍歷到第一行。代碼也可將指針置于每頁第一行的前面,然后在 <CODE>while</CODE> 循環中使用
<CODE>next</CODE> 方法,以在每頁中從最第一行遍歷到最后一行。
<P>以下代碼片斷假定是前一個代碼片斷的繼續,這意味著第十個 <CODE>CachedRowSet</CODE>
對象的指針位于最后一行。代碼將指針移到最后一行的后面,這樣第一次調用方法 <CODE>previous</CODE>
會將指針放回到最后一行上。遍歷最后一頁(<CODE>CachedRowSet</CODE> 對象 <I>crs</I>)的所有行后,代碼接著會進入
<CODE>while</CODE> 循環以獲得第九頁、向后遍歷各行、轉至第八頁、向后遍歷各行,依此類推,直到第一頁的第一行為止。 <PRE> crs.afterLast();
while(crs.previous()) {
. . . // navigate through the rows, last to first
{
while(crs.previousPage()) {
crs.afterLast();
while(crs.previous()) {
. . . // go from the last row to the first row of each page
}
}
</PRE>
<P>
<P>
<HR>
<P><!-- =========== FIELD SUMMARY =========== --><A
name=field_summary><!-- --></A>
<TABLE cellSpacing=0 cellPadding=3 width="100%" summary="" border=1>
<TBODY>
<TR class=TableHeadingColor bgColor=#ccccff>
<TH align=left colSpan=2><FONT size=+2><B>字段摘要</B></FONT></TH></TR>
<TR class=TableRowColor bgColor=white>
<TD vAlign=top align=right width="1%"><FONT
size=-1><CODE>static boolean</CODE></FONT></TD>
<TD><CODE><B><A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/javax/sql/rowset/CachedRowSet.html#COMMIT_ON_ACCEPT_CHANGES">COMMIT_ON_ACCEPT_CHANGES</A></B></CODE>
<BR> 導致在調用
<CODE>acceptChanges()</CODE> 時,<CODE>CachedRowSet</CODE> 對象的
<CODE>SyncProvider</CODE> 提交更改。</TD></TR></TBODY></TABLE> <A
name=fields_inherited_from_class_java.sql.ResultSet><!-- --></A>
<TABLE cellSpacing=0 cellPadding=3 width="100%" summary="" border=1>
<TBODY>
<TR class=TableSubHeadingColor bgColor=#eeeeff>
<TH align=left><B>從接口 java.sql.<A title="java.sql 中的接口"
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html">ResultSet</A>
繼承的字段</B></TH></TR>
<TR class=TableRowColor bgColor=white>
<TD><CODE><A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#CLOSE_CURSORS_AT_COMMIT">CLOSE_CURSORS_AT_COMMIT</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#CONCUR_READ_ONLY">CONCUR_READ_ONLY</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#CONCUR_UPDATABLE">CONCUR_UPDATABLE</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#FETCH_FORWARD">FETCH_FORWARD</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#FETCH_REVERSE">FETCH_REVERSE</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#FETCH_UNKNOWN">FETCH_UNKNOWN</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#HOLD_CURSORS_OVER_COMMIT">HOLD_CURSORS_OVER_COMMIT</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#TYPE_FORWARD_ONLY">TYPE_FORWARD_ONLY</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#TYPE_SCROLL_INSENSITIVE">TYPE_SCROLL_INSENSITIVE</A>,
<A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/ResultSet.html#TYPE_SCROLL_SENSITIVE">TYPE_SCROLL_SENSITIVE</A></CODE></TD></TR></TBODY></TABLE>
<!-- ========== METHOD SUMMARY =========== --><A
name=method_summary><!-- --></A>
<TABLE cellSpacing=0 cellPadding=3 width="100%" summary="" border=1>
<TBODY>
<TR class=TableHeadingColor bgColor=#ccccff>
<TH align=left colSpan=2><FONT size=+2><B>方法摘要</B></FONT></TH></TR>
<TR class=TableRowColor bgColor=white>
<TD vAlign=top align=right width="1%"><FONT
size=-1><CODE> void</CODE></FONT></TD>
<TD><CODE><B><A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/javax/sql/rowset/CachedRowSet.html#acceptChanges()">acceptChanges</A></B>()</CODE>
<BR> 將對此
<CODE>CachedRowSet</CODE> 對象所做的行更新、插入以及刪除更改傳播到底層數據源。</TD></TR>
<TR class=TableRowColor bgColor=white>
<TD vAlign=top align=right width="1%"><FONT
size=-1><CODE> void</CODE></FONT></TD>
<TD><CODE><B><A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/javax/sql/rowset/CachedRowSet.html#acceptChanges(java.sql.Connection)">acceptChanges</A></B>(<A
title="java.sql 中的接口"
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/sql/Connection.html">Connection</A> con)</CODE>
<BR> 將所有行更新、插入以及刪除更改傳播到支持此
<CODE>CachedRowSet</CODE> 對象的數據源,使用指定的 <CODE>Connection</CODE>
對象建立到數據源的連接。</TD></TR>
<TR class=TableRowColor bgColor=white>
<TD vAlign=top align=right width="1%"><FONT
size=-1><CODE> boolean</CODE></FONT></TD>
<TD><CODE><B><A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/javax/sql/rowset/CachedRowSet.html#columnUpdated(int)">columnUpdated</A></B>(int idx)</CODE>
<BR> 指示此
<CODE>CachedRowSet</CODE> 對象當前行中的指定列是否已更新。</TD></TR>
<TR class=TableRowColor bgColor=white>
<TD vAlign=top align=right width="1%"><FONT
size=-1><CODE> boolean</CODE></FONT></TD>
<TD><CODE><B><A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/javax/sql/rowset/CachedRowSet.html#columnUpdated(java.lang.String)">columnUpdated</A></B>(<A
title="java.lang 中的類"
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/lang/String.html">String</A> columnName)</CODE>
<BR> 指示此
<CODE>CachedRowSet</CODE> 對象當前行中的指定列是否已更新。</TD></TR>
<TR class=TableRowColor bgColor=white>
<TD vAlign=top align=right width="1%"><FONT
size=-1><CODE> void</CODE></FONT></TD>
<TD><CODE><B><A
href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/javax/sql/rowset/CachedRowSet.html#commit()">commit</A></B>()</CODE>
<BR> 每個
<CODE>CachedRowSet</CODE> 對象的 <CODE>SyncProvider</CODE> 都包含一個取自
<CODE>ResultSet</CODE> 的 <CODE>Connection</CODE> 對象或傳遞到其構造方法的 JDBC
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -