2009-06-12 6 views
0

J'essaye de mettre en application une solution de pagination de base de données (vers l'avant seulement exigée) en utilisant un CachedRowSet pour paginer un AS400JDBCResultSet contenant les résultats de ma question.Est-ce que CachedRowSet fonctionne avec toutes les implémentations ResultSet?

J'ai essayé d'utiliser l'approche

CachedRowSet cachedRowSet = new CachedRowSetImpl(); 
cachedRowSet.setMaxRows(10); 
cachedRowSet.setPageSize(10); 
cachedRowSet.populate(resultSet); 

, mais l'ensemble des résultats (65 dossiers) est retourné dans la première page (par exemple en appelant cachedRowSet.next()). J'ai aussi essayé le

CachedRowSet cachedRowSet = new CachedRowSetImpl(); 
cachedRowSet.setPageSize(10); 
cachedRowSet.setMaxRows(0); 
cachedRowSet.setUsername("username"); 
cachedRowSet.setPassword("password"); 
cachedRowSet.setUrl("jdbc:as400://dev;naming=system;libraries=*LIBL;prompt=false;"); 
cachedRowSet.setCommand(query); 
cachedRowSet.execute(connection); 
approche

, mais je reçois l'exception suivante jeté sur le execute() appel

Exception in thread "main" java.lang.AbstractMethodError: java/sql/DatabaseMetaData.locatorsUpdateCopy()Z 
    at com.sun.rowset.CachedRowSetImpl.initMetaData(CachedRowSetImpl.java:712) 
    at com.sun.rowset.CachedRowSetImpl.populate(CachedRowSetImpl.java:617) 
    at com.sun.rowset.internal.CachedRowSetReader.readData(CachedRowSetReader.java:190) 
    at com.sun.rowset.CachedRowSetImpl.execute(CachedRowSetImpl.java:756) 

J'ai essayé sur les deux IBM & Sun JRE.

Des idées? Est-ce que cette fonctionnalité n'est pas supportée par mon pilote JDBC?

Mise à jour: Également se produit avec le pilote MySQL - donc je dois faire quelque chose d'autre faux, non?

Mise à jour (2): ont obtenu à travailler sur Java 5.0 & 6.0 pour Driver de MySql, mais seulement 6,0 pour mon AS400JDBCDriver - à la fois en utilisant la méthode 2 d'en haut. Semble être assez lent dans tous les cas.

Répondre

0

Il semble que votre pilote ne soit pas compatible avec JDBC 3.0, c'est-à-dire lorsque des ensembles de lignes ont été introduits dans l'API. AbstractMethodError le supporte.

Vérifiez la documentation de votre pilote pour voir quelle version de JDBC il prétend prendre en charge.

+0

Le pot contenant le pilote a une AS400JDBCRowSet de classe, donc j'imagine que ce n'est pas le problème. En outre, nous avons réussi à le faire fonctionner avec un JRE 6.0 et le même pilote. Merci cependant :) –

-2

La façon dont les pilotes sont appelés a changé avec les nouvelles versions de Java. L'ancienne école avait passe-partout supplémentaire, mais il fonctionne toujours avec Java 6.

Connection c = null; 
try { 
     Class.forName(driverString); 
    } catch (ClassNotFoundException e) { 
     //TODO 
    } 
c = DriverManager.getConnection(url, username, password); 
+0

Merci pour la réponse, mais j'ai essayé d'utiliser la méthode de définition des noms de pilotes à partir de javadocs DriverManager (définissant la propriété système jdbc.drivers). Cela ne fait aucune différence - même erreur pour le pilote AS400 :( –

+0

Vous ne savez pas ce que vous dites ici La ligne 'Class.forName()' est devenue inutile dans JDBC 4, 2007. – EJP

Questions connexes