Oracle
 sql >> Base de données >  >> RDS >> Oracle

Tomcat 9 avec Apache DBCP + Spring 5 + Oracle 12c + SqlArrayValue

Il semble que spring-data-jdbc-ext est EOL. La classe SqlArrayValue ne déballe tout simplement pas la connexion. J'ai fini par abandonner les extensions JDBC et lancer ma propre classe très similaire qui gère le déballage de la connexion. Cela fonctionne maintenant sur WebLogic et Tomcat (avec accessToUnderlyingConnectionAllowed défini sur true) DBCP et le pool de connexion natif de Tomcat (aucun accessToUnderlyingConnectionAllowed requis).

import java.sql.Connection;
import java.sql.SQLException;

import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.jdbc.core.support.AbstractSqlTypeValue;

import oracle.jdbc.OracleConnection;

public class OracleSqlArrayValue<T> extends AbstractSqlTypeValue {
    private T[] values;
    private String defaultTypeName;

    public OracleSqlArrayValue(T[] values) {
        this.values = values;
    }

    public OracleSqlArrayValue(T[] values, String defaultTypeName) {
        this.values = values;
        this.defaultTypeName = defaultTypeName;
    }

    @Override
    protected Object createTypeValue(Connection conn, int sqlType,
            String typeName) throws SQLException {

        if (typeName == null && defaultTypeName == null) {
            throw new InvalidDataAccessApiUsageException(
                    "No type named defined. Instantiate class with default type name.");
        }

        if (!conn.isWrapperFor(OracleConnection.class)) {
            throw new InvalidDataAccessApiUsageException(
                    "Unable to unwrap OracleConnection. Ensure you are connecting to an Oracle DB.");
        }

        return conn.unwrap(OracleConnection.class).createOracleArray(
                typeName != null ? typeName : defaultTypeName, values);
    }
}