我使用Hikari Pool
和OracleCallableStatement
:
我的数据源:
<bean id="myDataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl" value="${my.oracle.url}"/>
<property name="driverClassName" value="oracle.jdbc.pool.OracleDataSource"/>
<property name="username" value="${my.oracle.user}"/>
<property name="password" value="${my.oracle.password}"/>
</bean>
我尝试向Oracle
发出请求:public List getProducts(int numbersMonths,Long initServiceId,
List<Long> serviceIds) throws SQLException {
Connection cnn = null;
OracleCallableStatement stm = null;
ResultSet rs = null;
List<ProductLink> res = new ArrayList<>();
final String sql = sqlCust(sqlProducts);
try {
cnn = custDataSource.getConnection();
stm = (OracleCallableStatement) cnn.prepareCall(sql);
stm.setPlsqlIndexTable(1, serviceIds.toArray(), serviceIds.size(), serviceIds.size(), OracleTypes.BIGINT, 0);
stm.registerOutParameter(2, OracleTypes.CURSOR);
stm.setLong(3, initServiceId);
stm.setInt(4, numbersMonths);
stm.execute();
rs = stm.getCursor(2);
// do stuff
} catch (SQLException ex) {
DbUtils.closeQuietly(cnn, stm, rs);
throw ex;
} finally {
DbUtils.closeQuietly(cnn, stm, rs);
}
但我在这一行上有错误:qazxsw poi
stm = (OracleCallableStatement) cnn.prepareCall(sql);
我也有一个错误:
java.lang.ClassCastException: com.zaxxer.hikari.pool.HikariProxyCallableStatement cannot be cast to oracle.jdbc.OracleCallableStatement
在这条线上:Failed to create instance of driver class oracle.jdbc.pool.OracleDataSource, trying jdbcUrl resolution
java.lang.ClassCastException: oracle.jdbc.pool.OracleDataSource cannot be cast to java.sql.Driver
怎么了?为什么我会收到这个错误?
实际上,由于您使用的是连接池,因此cnn = custDataSource.getConnection();
实现不是来自驱动程序,而是来自该连接池。
您应该找到一种方法来访问核心实现(我认为这是有风险的),或者您应该尝试仅使用CallableStatement
,而不是依赖于Oracle实现。
请改用CallableStatement
用于执行SQL存储过程的接口。 JDBC API提供了一个存储过程SQL转义语法,允许以标准方式为所有RDBMS调用存储过程。
这是由CallableStatement方法使用的
创建CallableStatement对象