HikariCP 通过 Oracle 自定义类型

Posted

技术标签:

【中文标题】HikariCP 通过 Oracle 自定义类型【英文标题】:HikariCP pass Oracle custom type 【发布时间】:2017-02-26 12:07:21 【问题描述】:

我从 Oracle 默认数据源切换到 HikariCP。有一段代码,我将自定义 Oracle 类型传递给存储的参数,并将 java.sql.Connection 转换为 oracle.jdbc.OracleConnection

try(OracleConnection connection = (OracleConnection) dbConnect.getConnection()) 
        try(CallableStatement callableStatement = connection.prepareCall("? = call pkg_applications.add_application(?,?,?)")) 
            callableStatement.registerOutParameter(1, Types.VARCHAR);
            callableStatement.setString(2, form.getPolicyNumber());
            callableStatement.setString(3, form.getPolicyStart());

            Object[][] uploads = new Object[wrappers.size()][];

            for(int i=0; i<wrappers.size(); i++) 
                uploads[i] = new Object[4];
                uploads[i][0] = wrappers.get(i).getName();
                uploads[i][1] = wrappers.get(i).getFile().getContentType();
                uploads[i][2] = wrappers.get(i).getFile().getSize();
                uploads[i][3] = wrappers.get(i).getLocation();
            

            callableStatement.setArray(4, connection.createARRAY("T_UPLOAD_FILE_TABLE", uploads));

            callableStatement.execute();
            int applicationId = callableStatement.getInt(1);

            operationResponse.setData(applicationId);
            operationResponse.setCode(ResultCode.OK);
        
    
    catch(Exception e) 
        log.error(e.getMessage(), e);
    

我收到了java.lang.ClassCastException - com.zaxxer.hikari.pool.HikariProxyConnection cannot be cast to oracle.jdbc.OracleConnection

如何使用 HikariCP 将 Oracle 自定义类型传递给存储过程?

【问题讨论】:

【参考方案1】:

您从池中获得的是代理连接。 要访问底层的 Oracle 连接,您应该使用 unwrap() 和 isWrapperFor():

try (Connection hikariCon = dbConnect.getConnection()) 
   if (hikariCon.isWrapperFor(OracleConnection.class)) 
      OracleConnection connection = hikariCon.unwrap(OracleConnection.class);
      :
      :
   

但是,在您的示例中,OracleConnection 特定于哪种方法?你可能根本不需要投射!

【讨论】:

我需要传递一个自定义类型 T_UPLOAD_FILE_TABLE 这是另一个自定义类型的表。您能否发送一个指向 HikariCP 文档的链接,我可以在哪里找到它?如何使用 HCP 将自定义 oracle 类型传递给存储过程? 你试过移除演员表吗?如果你不投,connection.createARRAY("T_UPLOAD_FILE_TABLE", uploads));抛出异常?如果是这样,您是否尝试过使用 unwrap ?如果您需要更具体的内容,请查找 OracleConnection 的文档。 HTH 它解决了我的问题。如果没有强制转换,我无法使用,它会抛出“java.sql.SQLException:不支持的功能”。但是打开 HikariProxyConnection 就可以了!谢谢老哥!

以上是关于HikariCP 通过 Oracle 自定义类型的主要内容,如果未能解决你的问题,请参考以下文章

oracle 自定义函数,调用时报“程序包或函数无效”

Oracle - 将游标数据插入自定义类型表

尝试传递自定义 oracle 类型对象映射时的名称模式无效

将自定义类型传递给 Oracle 过程

oracle 自定义函数返回一个自定义整数列,如何在下一个自定义函数中,调用上一个函数

Oracle数据库存储过程中输出参数为自定义游标类型时,使用call或者exec调用时,用啥来给游标赋值