You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用CachedRowSet遇Provider未找到异常求解决方案(JDK8)

解决CachedRowFactoryImpl找不到的异常问题

针对你在JDK1.8.0_201环境下使用CachedRowSet时抛出的java.sql.SQLException: Provider com.sun.rowset.RowSetFactoryImpl not found异常,提供以下几种解决办法:

1. 引入标准CachedRowSet第三方实现

如果使用的是OpenJDK或裁剪版JDK,自带的RowSet实现可能缺失,可以添加GlassFish提供的标准RowSet依赖(兼容JDK规范):

<!-- Maven依赖 -->
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.sql.rowset</artifactId>
    <version>1.1</version>
</dependency>

添加后无需修改原有代码,RowSetProvider会自动发现并使用该实现。如果自动发现失效,可手动指定工厂类:

CachedRowSet cachedRowSet = RowSetProvider.newFactory(
    "org.glassfish.jdbc.rowset.RowSetFactoryImpl", 
    null
).createCachedRowSet();

2. 手动缓存结果集(推荐)

直接避免依赖CachedRowSet,将ResultSet数据转换为业务对象列表,既规避内部包依赖问题,也更符合业务逻辑:

首先定义业务对象:

public class USState {
    private String stateCode;
    private String stateName;

    // 构造器、Getter、Setter方法
    public USState(String stateCode, String stateName) {
        this.stateCode = stateCode;
        this.stateName = stateName;
    }

    // Getter和Setter省略
}

修改原方法:

import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public List<USState> getUSStates() {
    _log.info("Calling stored proc for ocrt give data");

    try(Connection inGlobalConnections = getConnection();
        CallableStatement callableStatement = inGlobalConnections.prepareCall("{call mst.USP_GetUSStates()}")) {

        callableStatement.execute();
        try(ResultSet resultSet = callableStatement.getResultSet()) {
            List<USState> stateList = new ArrayList<>();
            while(resultSet.next()) {
                // 根据实际列名替换参数
                USState state = new USState(
                    resultSet.getString("state_code"),
                    resultSet.getString("state_name")
                );
                stateList.add(state);
            }
            return stateList;
        }
    } catch (SQLException e) {
        _log.error(e, e);
    }

    return new ArrayList<>();
}

这种方式完全不依赖JDK内部类,结果数据可独立于数据库连接存在,代码可读性和可维护性更强。

3. 更换完整JDK版本

如果使用的是裁剪版JDK,可更换为完整的Oracle JDK 1.8.0_201,该版本默认包含com.sun.rowset.RowSetFactoryImpl类,能直接运行原有代码。但不推荐依赖内部包,后续JDK版本可能会移除该实现。

内容的提问来源于stack exchange,提问作者Anubhav kalra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:25:09