Bem, a idéia do cache é mais ou menos assim o List (vamos chamá-lo de ValueList) requisita linhas para um SessionBean Stateful. O sateful pede um bloco grande para o banco (supomos que seja 200 registros) e retorna um cache de, por exemplo, 100 para o ValueList. Quando o get do ValueList pedir o objeto 101, o mesmo ira acessar o stateful que retornará mais 100 direto do cache. Agora se o ValueList pedir o objeto 201, o stateful fará uma consulta ao banco trazendo do 200 ao 400 e retornará novamente do 200 até o 300 para o ValueList.
Não sei se consegui me explicar…
Segue abaixo um tableModel de exemplo que eu fiz para testar, mas o mesmo causa um loucura na pintura da tela:
class Model extends AbstractTableModel {
private String[][] data = { { "T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }, {
"T", "A" }, {
"R", "S" }, {
"L", "M" }, {
"N", "O" }, {
"T", "U" }, {
"A", "B" }
};
public int getColumnCount() {
return 2;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
public int getRowCount() {
return data.length;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
public Object getValueAt(int rowIndex, int columnIndex) {
Task task = new Task() {
public Object run() throws InterruptedException {
Thread.sleep(500);
return null;
}
};
try {
Worker.post(task);
} catch (Exception ignored) {}
return data[rowIndex][columnIndex];
}
}
Veja que estou usando o sleep para simular a busca de dados.