У нас есть приложение Spring MVC J2EE, которое работает на Orale WebLogi c, которое мы пытаемся перенести на Apache Tomcat. Кажется, все работает, за исключением проблем с привязкой значений массива через JDB C в базу данных. Вот как это было успешно сделано в WebLogi c.
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);
Переменная statuses - это массив String, а VARCHAR_TABLE_T - такой же тип DB Oracle. SqlArrayValue - это класс Spring, специально предназначенный для обработки массива Oracle в JDB C.
. Когда код выполняется, мы получаем следующую ошибку (опять-таки, это нарушается только в 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]
Я обнаружил в сети кучу сообщений о развертывании соединения, чтобы иметь возможность выполнять действия c, указанные поставщиком, однако, похоже, что Spring должен сделать это для меня? Я попытался установить для accessToUnderlyingConnectionAllowed значение true на сервере Tomcat. xml (что-то, что я нашел в Интернете), где у нас есть настройка ресурса соединения, но это не повлияло на поведение.
Вот ресурс с сервера. 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" />