使用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
相关产品推荐
相关产品推荐

