At this point, the command for crs
is the query {@code "SELECTFIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS WHERE CREDIT_LIMIT > 5000 AND REGION = "West"}. After the readData
method executes this command with the following line of code, it will have the data from rs
with which to populate crs
.
{@code ResultSet rs = pstmt.executeQuery();}
The preceding code fragments give an idea of what goes on behind the scenes; they would not appear in an application, which would not invoke methods like readData
and decodeParams
. In contrast, the following code fragment shows what an application might do. It sets the rowset's command, sets the command's parameters, and executes the command. Simply by calling the execute
method, crs
populates itself with the requested data from the table CUSTOMERS
.
{@code crs.setCommand("SELECT FIRST_NAME, LAST_NAME, ADDRESS FROM CUSTOMERS" + "WHERE CREDIT_LIMIT > ? AND REGION = ?"); crs.setInt(1, 5000); crs.setString(2, "West"); crs.execute();}
CachedRowSet
object stores data in memory, the amount of data that it can contain at any one time is determined by the amount of memory available. To get around this limitation, a CachedRowSet
object can retrieve data from a ResultSet
object in chunks of data, called pages. To take advantage of this mechanism, an application sets the number of rows to be included in a page using the method setPageSize
. In other words, if the page size is set to five, a chunk of five rows of data will be fetched from the data source at one time. An application can also optionally set the maximum number of rows that may be fetched at one time. If the maximum number of rows is set to zero, or no maximum number of rows is set, there is no limit to the number of rows that may be fetched at a time. After properties have been set, the CachedRowSet
object must be populated with data using either the method populate
or the method execute
. The following lines of code demonstrate using the method populate
. Note that this version of the method takes two parameters, a ResultSet
handle and the row in the ResultSet
object from which to start retrieving rows.
CachedRowSet crs = new CachedRowSetImpl(); crs.setMaxRows(20); crs.setPageSize(4); crs.populate(rsHandle, 10);When this code runs, crs will be populated with four rows from rsHandle starting with the tenth row.
The next code fragment shows populating a CachedRowSet
object using the method execute
, which may or may not take a Connection
object as a parameter. This code passes execute
the Connection
object conHandle.
Note that there are two differences between the following code fragment and the previous one. First, the method setMaxRows
is not called, so there is no limit set for the number of rows that crs may contain. (Remember that crs always has the overriding limit of how much data it can store in memory.) The second difference is that the you cannot pass the method execute
the number of the row in the ResultSet
object from which to start retrieving rows. This method always starts with the first row.
CachedRowSet crs = new CachedRowSetImpl(); crs.setPageSize(5); crs.execute(conHandle);After this code has run, crs will contain five rows of data from the
ResultSet
object produced by the command for crs. The writer for crs will use conHandle to connect to the data source and execute the command for crs. An application is then able to operate on the data in crs in the same way that it would operate on data in any other CachedRowSet
object. To access the next page (chunk of data), an application calls the method nextPage
. This method creates a new CachedRowSet
object and fills it with the next page of data. For example, assume that the CachedRowSet
object's command returns a ResultSet
object rs with 1000 rows of data. If the page size has been set to 100, the first call to the method nextPage
will create a CachedRowSet
object containing the first 100 rows of rs. After doing what it needs to do with the data in these first 100 rows, the application can again call the method nextPage
to create another CachedRowSet
object with the second 100 rows from rs. The data from the first CachedRowSet
object will no longer be in memory because it is replaced with the data from the second CachedRowSet
object. After the tenth call to the method nextPage
, the tenth CachedRowSet
object will contain the last 100 rows of data from rs, which are stored in memory. At any given time, the data from only one CachedRowSet
object is stored in memory.
The method nextPage
returns true
as long as the current page is not the last page of rows and false
when there are no more pages. It can therefore be used in a while
loop to retrieve all of the pages, as is demonstrated in the following lines of code.
CachedRowSet crs = CachedRowSetImpl(); crs.setPageSize(100); crs.execute(conHandle); while(crs.nextPage()) { while(crs.next()) { . . . // operate on chunks (of 100 rows each) in crs, // row by row } }After this code fragment has been run, the application will have traversed all 1000 rows, but it will have had no more than 100 rows in memory at a time.
The CachedRowSet
interface also defines the method previousPage
. Just as the method nextPage
is analogous to the ResultSet
method next
, the method previousPage
is analogous to the ResultSet
method previous
. Similar to the method nextPage
, previousPage
creates a CachedRowSet
object containing the number of rows set as the page size. So, for instance, the method previousPage
could be used in a while
loop at the end of the preceding code fragment to navigate back through the pages from the last page to the first page. The method previousPage
is also similar to nextPage
in that it can be used in a while
loop, except that it returns true
as long as there is another page preceding it and false
when there are no more pages ahead of it.
By positioning the cursor after the last row for each page, as is done in the following code fragment, the method previous
navigates from the last row to the first row in each page. The code could also have left the cursor before the first row on each page and then used the method next
in a while
loop to navigate each page from the first row to the last row.
The following code fragment assumes a continuation from the previous code fragment, meaning that the cursor for the tenth CachedRowSet
object is on the last row. The code moves the cursor to after the last row so that the first call to the method previous
will put the cursor back on the last row. After going through all of the rows in the last page (the CachedRowSet
object crs), the code then enters the while
loop to get to the ninth page, go through the rows backwards, go to the eighth page, go through the rows backwards, and so on to the first row of the first page.
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 } }@author Jonathan Bruce
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|