在我们基于Spring 3.2.3的应用程序中,我们使用的是DBCP BasicDataSource,它在数据访问层中配置如下,
<bean id="appDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close" scope="singleton">
<qualifier value="appDataSource" />
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
!--other properties -->
<property name="accessToUnderlyingConnectionAllowed" value="true" />
</bean>
数据访问层将ojdbc6-11.2.0.1.0.jar作为其依赖项之一,并使用org.springframework.jdbc.core.simple.SimpleJdbcCall来调用存储过程。 基于Spring RESTful webservice的Web应用程序正在使用此数据访问层与oracle 11g数据库进行交互。该应用程序部署在WAS8.5中,并且运行正常。 现在我们计划将基于DBCP的数据源迁移到WAS 8.5提供的数据源配置。我们在WAS中添加了JDBC提供程序,oracle驱动程序的类路径是/opt/websphere/drivers/ojdbc6-11.2.0.1.0.jar,并在WAS中配置了数据源。数据源配置已从WAS集成控制台进行测试,测试成功。
现在有些服务因以下异常而失败,
Caused by: java.sql.SQLException: ORA-20181: MISSING MANDATORY PARAMETERS~ “####parameter name####”
ORA-06512: at "###package.procedure name###", line 2216
ORA-06512: at "###package.procedure name", line 2917
ORA-06512: at line 1
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:837) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:459) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:193) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:205) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:1244) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1585) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3929) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:4118) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:8721) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:4093) ~[ojdbc6-11.2.0.1.0.jar:11.2.0.1.0]
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) ~[commons-dbcp-1.3.jar:1.3]
at org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172) ~[commons-dbcp-1.3.jar:1.3]
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1072) ~[spring-jdbc-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate$6.doInCallableStatement(JdbcTemplate.java:1070) ~[spring-jdbc-3.2.3.RELEASE.jar:3.2.3.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1020) ~[spring-jdbc-3.2.3.RELEASE.jar:3.2.3.RELEASE]
... 66 common frames omitted
In the procedure call that fails, the input parameter of the procedure is of table of varchar2(20) type and from java side we are passing it as org.springframework.jdbc.core.support.AbstractSqlTypeValue of oracle.sql.Array .We are using org.springframework.jdbc.core.namedparam.MapSqlParameterSource for setting the input parameters as follows,
MapSqlParameterSource in = new MapSqlParameterSource();
in.addValue("policy_numbers_tbl", policyArraySqlType);
Here policyArraySqlType is of AbstractSqlTypeValue type.
看起来存储过程将输入参数设置为空,尽管值是从java端传递的。 我们已经分析了详细的类加载器日志,看起来这些类总是从服务器类路径中的ojdbc6-11.2.0.1.0.jar加载(如预期的那样)。服务器配置中的父最后一个选项或者在应用程序中添加deployment.xml(用于显式设置web应用程序的父最后一个设置)并不能解决此问题。
我们还尝试在Spring配置文件中配置数据源,如下所示
<jee:jndi-lookup id="appDataSource" resource-ref="true"
jndi-name="jdbc/mydatasource" proxy-interface="javax.sql.DataSource" />
但我们也面临同样的问题。 对此有任何帮助表示高度赞赏。
谢谢, 阿宾
答案 0 :(得分:0)