PoolingDataSource — Как использовать реализацию PreparedStatement для конкретного драйвера

#java #jdbc #apache-commons-dbcp

#java #jdbc #apache-commons-dbcp

Вопрос:

Я внедрил commons dbcp PoolingDataSource , и он работает отлично — вплоть до тех пор, пока не столкнулся с проблемой использования конкретной реализации java.sql.PreparedStatement интерфейса.

 ((OraclePreparedStatement) getStatement()).registerReturnParameter(index, sqlType); 

java.lang.ClassCastException: 
org.apache.commons.dbcp.DelegatingPreparedStatement 
cannot be cast to oracle.jdbc.OraclePreparedStatemen
  

Я понимаю, почему это происходит. Есть ли какой-либо способ использовать реализацию PreparedStatement для конкретного поставщика, но при этом иметь возможность использовать пул соединений, предоставляемый Commons DBCP?Я хотел бы использовать registerReturnParameter() и getReturnResultSet(), которые специфичны для реализации Oracle. Я знаю, что нарушил кардинальное правило № 1 …

Кроме того, PoolingDataSource оборачивает OracleXADataSource, что заставляет меня поверить, что это как-то возможно сделать…

Ответ №1:

Название DelegatingPreparedStatement подразумевает, что оно просто делегирует исходному оператору. Итак, вы вызываете delecatingPrepartedStatement.getDelegate() , который вернет OraclePreparedStatement .

Но на самом деле, старайтесь этого не делать.

Комментарии:

1. Спасибо и извините за нарушение правил в этом :/