gpt4 book ai didi

java - 当需要 nativeJdbcExtractor 时,Spring 5 JDBC 方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:47:29 32 4
gpt4 key购买 nike

我刚刚升级了 Spring/SpringBoot 依赖项并注意到类 JdbcTemplate 不再具有属性“nativeJdbcExtractor”。

我能够找到详细信息和背景: https://jira.spring.io/browse/SPR-14670

但是我找不到替换配置。我使用 commons-dbcp 库和 Spring 类,如 SimpleJdbcCall 等。我从不处理低级 JDBC API,但是如果供应商代码需要其真正的连接类型 (Oracle),则 nativeJdbcExtractor 设置确保它将在 Spring JDBC 代码(不是我的应用程序代码)的某个深处获取它。如果我需要 Spring API 像过去一样自动处理此问题,我不确定如何通过调用 connection.unwrap() 来解决此问题。

java.lang.ClassCastException: org.apache.commons.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper 无法转换为 oracle.jdbc.OracleConnection

它是否隐藏在数据源配置中的某处?我已经从 commons-dbcp 1.4 升级到 commons-dbcp2 但到目前为止找不到任何有用的东西(BasicDataSource)。

更新:以下线程是相关的,但我无法理解我正在寻找的答案,因为 Connection 对象是在 JdbcTemplate 类中获得的,因此不受我的控制。

replacement for jdbc.support.nativejdbc remove in Spring 5

更新 #2 - 堆栈跟踪

Caused by: java.lang.ClassCastException: org.apache.commons.dbcp2.PoolingDataSource$PoolGuardConnectionWrapper cannot be cast to oracle.jdbc.OracleConnection
at oracle.sql.TypeDescriptor.setPhysicalConnectionOf(TypeDescriptor.java:832)
at oracle.sql.TypeDescriptor.<init>(TypeDescriptor.java:586)
at oracle.sql.ArrayDescriptor.<init>(ArrayDescriptor.java:224)
at org.springframework.data.jdbc.support.oracle.SqlArrayValue.createTypeValue(SqlArrayValue.java:90)
at org.springframework.jdbc.core.support.AbstractSqlTypeValue.setTypeValue(AbstractSqlTypeValue.java:60)
at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:293)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:232)
at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:147)
at org.springframework.jdbc.core.CallableStatementCreatorFactory$CallableStatementCreatorImpl.createCallableStatement(CallableStatementCreatorFactory.java:200)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1048)
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1104)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:414)
at org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:397)
at org.springframework.jdbc.core.simple.SimpleJdbcCall.execute(SimpleJdbcCall.java:193)

更新 #3 - 执行转换的代码 (Oracle JDBC)

    public void setPhysicalConnectionOf(Connection var1) {
this.connection = ((oracle.jdbc.OracleConnection)var1).physicalConnectionWithin();
}

最佳答案

新:

看起来您正在使用 spring-data-jdbc-ext 中的 org.springframework.data.jdbc.support.oracle.SqlArrayValue。错误在那里,解包应该在那里发生。

类似下面的内容(未经测试)

protected Object createTypeValue(Connection conn, int sqlType, String typeName)
throws SQLException {
return conn.unwrap(OracleConnection.class).createArray(typeName, values);
}

关于 JDBC 驱动程序:

您正在使用 Java 8 或更高版本,因为 Spring 5 需要 Java 8。因此您应该使用 ojdbc8(8 表示 Java 8)。我强烈建议使用来自 http://www.oracle.com/technetwork/database/application-development/jdbc/downloads/index.html 的最新 12.2.0.1 驱动程序.

如果您从 http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#01_02 检查驱动程序互操作性矩阵你会看到这个潜水员也适用于旧数据库。

旧的/过时的:

在执行强制转换而不是强制转换的代码中调用 #unwrap。所以不是

OracleConnection oracleConnection = (OracleConnection) connection;

打电话

OracleConnection oracleConnection = connection.unwrap(OracleConnection.class);

在堆栈跟踪中,您可以看到谁在执行转换,这将在您的代码中,因为 SimpleJdbcCall 和 friend 不会大小写到 OracleConnection。问题不在 JdbcTemplate 中,而在执行转换的代码中。

关于java - 当需要 nativeJdbcExtractor 时,Spring 5 JDBC 方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50295340/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com