【发布时间】:2020-05-23 00:18:19
【问题描述】:
我们有在 Orale WebLogic 上运行的现有 SpringMVC J2EE 应用程序,我们正在尝试将其迁移到 Apache Tomcat。除了通过 JDBC 将数组值绑定到数据库时遇到问题外,一切似乎都正常。这是在 WebLogic 上成功完成的方法。
SqlParameterSource in = new MapSqlParameterSource()
.addValue("i_username", user.getUsername())
.addValue("i_statuses",
new SqlArrayValue<String>(statuses,
"VARCHAR_TABLE_T"));
Map<String, Object> out = myDatabaseProc.execute(in);
状态变量是一个字符串数组,而 VARCHAR_TABLE_T 是一个相同的 Oracle DB 类型。 SqlArrayValue 是一个 Spring 类,专门用于 JDBC 中的 Oracle 数组处理。
当代码执行时,我们得到以下错误(同样,这仅在 Tomcat 上被破坏)。
java.lang.ClassCastException: org.apache.tomcat.dbcp.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.OracleConnection
at oracle.sql.TypeDescriptor.setPhysicalConnectionOf(TypeDescriptor.java:803) ~[ojdbc8.jar:12.2.0.1.0]
at oracle.sql.TypeDescriptor.<init>(TypeDescriptor.java:585) ~[ojdbc8.jar:12.2.0.1.0]
at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:258) ~[ojdbc8.jar:12.2.0.1.0]
at org.springframework.data.jdbc.support.oracle.SqlArrayValue.createTypeValue(SqlArrayValue.java:90) ~[spring-data-oracle-1.2.1.RELEASE.jar:?]
at org.springframework.jdbc.core.support.AbstractSqlTypeValue.setTypeValue(AbstractSqlTypeValue.java:60) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:293) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:232) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:147) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:209) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1090) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1147) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:412) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:372) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:198) ~[spring-jdbc-5.2.3.RELEASE.jar:5.2.3.RELEASE]
我在网上找到了一堆关于解开连接以便能够执行供应商特定操作的信息,但是似乎 Spring 应该为我这样做?我尝试在 Tomcat 的 server.xml(我在网上找到的东西)中将 accessToUnderlyingConnectionAllowed 设置为 true,我们在那里设置了连接资源,但这并不影响行为。
这是来自 server.xml 的资源。
<Resource name="jdbc/datasource" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@//db.domain.com:port/sid"
username="user" password="password"
maxTotal="15" maxIdle="3" maxWaitMillis="-1"
accessToUnderlyingConnectionAllowed="true" />
【问题讨论】:
-
看来这可能与另一篇文章中讨论的问题相同。我可以看到 SqlArrayValue.createTypeValue 未正确解开连接的位置,但没有提出解决方案。 stackoverflow.com/questions/50295340/…
标签: spring oracle tomcat spring-jdbc tomcat-dbcp