I would recommend you choose CachedRowSet.
The CachedRowSet object is a container for data rows that caches its rows in memory, which allows you to work without a permanent connection to the data source.
The CachedRowSet object is an unrelated set of rows, which means that it uses a short connection to the data source. It connects to the data source while it reads the data to fill itself with rows and again while it passes the changes back to the original data source.
Because the CachedRowSet object stores data in memory, the amount of data it can hold at any given time is determined by the amount of available memory. To get around this limitation, a CachedRowSet object can retrieve data from a ResultSet in pieces of data called pages. To use this mechanism, the application sets the number of rows that will be included in the page using the setPageSize method. In other words, if the page size is set to five, a fragment of five rows of data will be extracted from the data source. An application can also set the maximum number of rows that can be selected at a time. If the maximum number of rows is set to zero or the maximum number of rows is not specified, then the number of rows that can be selected at a time is not limited.
After the properties have been set, the CachedRowSet object must be populated with data using either the method or the execute method. The following lines of code demonstrate the use of this method. Note that this version of the method accepts two parameters: the ResultSet descriptor and the string in the ResultSet object from which the string search begins.
CachedRowSet crs = new CachedRowSetImpl(); crs.setMaxRows(20); crs.setPageSize(4); crs.populate(rsHandle, 10);
When this code is run, crs will be populated with four lines from rsHandle, starting from the tenth line.
On the same path, you can rely on a strategy to break down your data into JSPs, etc. etc.
source share