Bom, sou iniciante em Java, mas tenho uma boa experiência
com banco de dados (sou DBA Oracle).
Não sei, sinceramente, se existe algum mecanismo do
lado do Java que consiga gerenciar isso, o que acho
muito difícil. Talvez uma solução seria filtrar os 100
primeiros registros pra primeira página, e uma thread
concorrente ir carregando o resto dos dados pra uma
estrutura de memória (isso tudo do lado do Java).
No lado do banco de dados, infelizmente não dá pra
fazer isso, e te garanto que seria uma loucura tentar
implementar algo dessa maneira, pois corre um sério
risco do tempo de resposta ficar muito mais lento
do que da maneira que vc já tem.
3000 linhas é uma quantidade de registros relativamente
pequena (do lado do banco de dados). Se está lento
seu sistema, é bom verificar se a lentidão é no lado
da aplicação ou no banco de dados. Já te adianto que
é inadmissível um banco de dados demorar muito pra
responder esse número de registros e, caso esteja acontecendo
essa lentidão no banco de dados (testar rodando a mesma query
numa ferramenta nativa do banco) então é hora
de fazer um tunning na base de dados.