2016-10-17 2 views
3

Я переключился на HikariCP из Oracle datasource. Существует фрагмент кода, в котором я передаю пользовательский тип Oracle в сохраненный параметр и литой java.sql.Connection в oracle.jdbc.OracleConnection.HikariCP pass Пользовательский тип Oracle

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.

Как я могу передать пользовательские типы Oracle в хранимую процедуру с использованием HikariCP?

ответ

6

Что вы получаете от пула - это прокси-соединение. Чтобы получить доступ к лежащей в основе соединения Oracle, вы должны использовать развертку() с isWrapperFor():

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

Однако этот способ является OracleConnection специфический в вашем примере? вам может не понадобиться бросить все!

+0

Мне нужно передать пользовательский тип T_UPLOAD_FILE_TABLE, который является таблицей другого настраиваемого типа. Можете ли вы отправить ссылку на документы HikariCP, где я могу ее найти? Как передать пользовательский тип оракула в хранимые процедуры с помощью HCP? – 0bj3ct

+1

Вы пытались удалить бросок? Если вы не выбрали, делает connection.createARRAY («T_UPLOAD_FILE_TABLE», загружает)); бросает исключение? Если это так, попробовали ли вы использовать разворот? Ищите документацию OracleConnection, если вам нужно что-то более конкретное. HTH – Nitin

+0

Это решило мою проблему. Я не мог использовать без броска, он бросает «java.sql.SQLException: Неподдерживаемая функция». Но развёртывание HikariProxyConnection выполнило эту работу! Спасибо тебе, друг! – 0bj3ct

Смежные вопросы