[SQLServer] ResultSet.absolute(int) não funciona

9 respostas
Rafael_Afonso

Olá:

Estou usando SQLSrver 2000 (versão 8.00.194) com o driver da Microsoft (versão 2.2.0029).
Na minha aplicação estou paginação. Isso significa que dependendo da página escolhida, quero que o cursor avance um certo número de posições até chegar a posição escolhida e daí recolho os dados até conseguir o número de dados a serem exbidos. A princício usei o método ResultSet.absolute(int). Entretanto quando faço isso aparece a seguinte exceção:

O curioso é que na documentação que acompanha o dirver, está escrito que ResultSet.absolute(int) é suportado. :shock: Antes que alguém pergunte, a mesma exceção acontece quando tento usar o driver jTDS.
Como conseqüência tive que usar o seguinte método para avançar nos registros do SQL Server:

for(int i = 0; (i < pos) && rs.next(); i ++) {}

O problema é que dependendo da página que quero visualizar, o tempo que devo aguardar até chegar ao registro desejado pode ser considerável.
:?: Alguém tem alguma idéia de como contornar isso?

Grato,

9 Respostas

Daniel_Quirino_Olive

CachedRowSet.

Rafael_Afonso

Onde acho exemplo disso? Procurei no JavaAlmanac e não tinha nada (aliás não tem nada de javax.sql.*). Na API do javax.sql não aparece nada sobre CachedRowSet, apenas RowSet. Como o obtenho? Tem certeza que isso vale para a API 1.4.x?

Grato,

Daniel_Quirino_Olive

Opa, vale sim. Tem este artigo no Developer Connection que é bem útil: http://developer.java.sun.com/developer/technicalArticles/javaserverpages/cachedrowset/
Como dizem por aí, boa leitura :smiley:

T

Meu pesames Rafael. Usar o driver jdbc do sqlserver eh horrivel

Bem a sua situacao eh a seguinte. o driver jdbc tem na verdade doiis metodos de fazer consulta, selecionados pelo parametro de conexao chamado SelectMethod. ele pode ser direct ou cursor. Basta voce colocar na criacao da conexao o SelectMethod=direct.

Infelizmente o modo de posicionamento absoluto do resultset nao esta disponivel nos dois modos. Nao me recordo ao certo qual permite essa funcionalidade (tenho a impressao que eh o direct). Soh ha um porem do modo direct, ele copia toda o resultado para o lado do cliente (se der um select * from usuario e tiver 10000 registros, vai papar toda a ram do cliente ) . Alem disso nao eh possivel fazer uso de transacao do modo direct.

Ja com o modo cursor nao tem esses problemas, o cursor fica no servidor e vem chunks (configuraveis) de 20 registros. Nao ha problemas com transacoes. Porem parece que o posicionamento absoluto nao eh possivel. Bem, quem sabe um dia M$ ajeita o driver.

Daniel_Quirino_Olive

Ahhhh… conversando com o luiz_ross pelo ICQ, eu me lembrei de uma solução de paginação que eu tinha achado na Sun há algum tempo atrás e que funciona muito bem: http://java.sun.com/blueprints/code/jps13/src/com/sun/j2ee/blueprints/catalog/model/Page.java.html
E uma leiturinha completementar interessante:
http://crazybob.org/roller/page/crazybob/20030305

Rafael_Afonso

Pelo que entendi, tanto a página da Sun, quanto o Value List Handler (a sugestão do crazybob), implicam em pegar todos as linhas da query, gerar uma list dos objetos e depois guardá-los na memória. Isso não é interessante para mim pois dependendo das consultas feitas poderei acumular listas demais e sobrecarregar a memória. :frowning:

Grato,

louds

Nesse caso você poder usar Page-by-Page Iterator ou Lazy Loading

TedLoprao

Realmente, eu estou usando Lazy Loading e ficou muito bom!!!

Rafael_Afonso

Curioso… Mê dê um exemplo.

Criado 13 de novembro de 2003
Ultima resposta 18 de nov. de 2003
Respostas 9
Participantes 5