CachedRowSet是否适用于所有ResultSet实现?

时间:2009-06-12 08:56:16

标签: java jdbc cachedrowset

我正在尝试使用CachedRowSet来实现数据库分页解决方案(只需转发),以便对包含查询结果的AS400JDBCResultSet进行分页。

我尝试过使用

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

接近,但在第一页中返回完整的结果集(65条记录)(即通过调用cachedRowSet.next())。我也试过了

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);

方法,但我在execute()调用

上抛出了以下异常
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)

我在IBM和& Sun JREs。

有什么想法吗?我的JDBC驱动程序是否支持此功能?

更新:也会发生MySQL驱动程序 - 所以我必须做错其他的事情,对吗?

更新(2):让它在Java 5.0& 6.0用于MySql的Driver,但只有6.0用于我的AS400JDBCDriver - 两者都使用上面的方法2。在任何情况下似乎都很慢。

2 个答案:

答案 0 :(得分:0)

听起来您的驱动程序可能不符合JDBC 3.0,这是在将行集引入API时。 AbstractMethodError支持这一点。

检查驱动程序文档以查看它声称支持的JDBC版本。

答案 1 :(得分:-2)

使用较新版本的Java更改了调用驱动程序的方式。旧学校有额外的锅炉,但它仍然适用于Java 6.

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