2012-06-19 3 views
0

У меня возникли проблемы с литьем CallableStatement на OracleCallableStatement. Это дает ClassCastException так:oracle.jdbc.OracleCallableStatement cast exception

java.lang.ClassCastException: 
    oracle.jdbc.driver.OracleCallableStatementWrapper cannot be cast to 
    oracle.jdbc.driver.OracleCallableStatement 

И код:

Connection conn = qdbDataSource.getConnection(); 
PreparedStatement pstmt = null; 
Connection conn2 = ((WLConnection)conn).getVendorConnection(); 
try { 
    CallableStatement cs = conn2.prepareCall("{ ?=call asr.bsc(?,?,?,?,?,?,?)}"); 
    OracleCallableStatement ocs = (OracleCallableStatement)cs; 
// (...) 
} 

Я пытался использовать родниковую шаблон JDBC, но результат был тот же.

Я использую WebLogic 10.3.2, а класс драйвера источника данных по умолчанию один. Я также использую ojdbc14.jar в моем проекте, пул пула запуска не включает его.

Любые идеи?

EDIT: Эти подклассы класса во время выполнения оберточной:

weblogic.jdbc.wrapper.CallableStatement_oracle_jdbc_driver_OracleCallableStatementWrapper class 
weblogic.jdbc.wrapper.CallableStatement class 
weblogic.jdbc.wrapper.PreparedStatement class 
weblogic.jdbc.wrapper.Statement class 
weblogic.jdbc.wrapper.JDBCWrapperImpl class 
weblogic.utils.wrapper.WrapperImpl class java.lang.Object 
+0

Что такое версия оракула и почему вам нужно его бросить !!!! я думаю, что вам это не нужно (литье), вы можете избежать этого, я имею в виду – shareef

+1

Я использую компоненты, указанные для oracle db. Функция, которую я пытаюсь назвать, полна ее. Мне нужен Oracle CallableStatement. Я думаю, что версия оракула здесь не так важна, потому что я не получаю ошибку при попытке подключиться к ней, но получаю callablestatement. – Neron

+0

@shareef он хочет использовать его, потому что OracleCallableStatement предлагает больше методов и является более сложным. – Sajmon

ответ

0

Я нашел его. Это была корзина ojdbc под моей папкой lib. Я использую заявление в weblogic.xml как:

предпочитают-webinf-классы

И это дает возможность использовать файлы фляги под webinf/Lib в первую очередь. Поэтому, когда он находит ojdbc.jar в этой папке, он просто подходит для моего приложения, но не для самой weblogic. Поскольку у weblogic есть своя банария ojdbc, и как-то она просто расширяет класс OracleCallableStatement, чтобы обернуть их из собственного баннера ojdbc. Поскольку у меня есть отдельный барабан ojdbc, во время выполнения он не мог отдать его в OracleCallableStatement моего jar. Когда я удалил банку под web-inf/lib и дал ответственность за части соединений и утверждений jdbc в weblogic, это сработало.

Благодарности

ребята
2

В ролях результат getVendorConnection() к OracleConnection, чем использовать OracleCallableStatement вместо CallableStatement,

oracle.jdbc.OracleConnection conn2 = (oracle.jdbc.OracleConnection)(((WLConnection)conn).getVendorConnection()); 
+0

Нет, это не сработало. Это меня не удивило, потому что это ничего не меняет, если я не использую другую реализацию метода «prepareCall» – Neron

2

Java. lang.ClassCastException: oracle.jdbc.driver.OracleCallableStatementWrapper нельзя отнести к oracle.jdbc.driver.OracleCallableStatement

Так что я работал несколько недель назад с OracleCallableStatement, и я решил его с помощью импорта ojdbc6.jar.

Таким образом, вы просто добавить в свой проект этот файл, и он предлагает непосредственно OracleCallableStatement,

OraclePreparedStatement и т.д ..

Все, что вам нужно, это import oracle.jdbc.OracleCallableStatement;, и она будет работы.

Connection con = null; 
OracleCallableStatement cs = null; 
try { 
    con = OracleDAOFactory.getOracleDatabaseConnection(); 
    cs = (OracleCallableStatement) con.prepareCall(SOME_PROCEDURE); 
    ... 
} 

Посмотрите на this.

+0

У меня было это в моих собственных папках с папками проектов, и это была проблема с чуваком :) см. Мой ответ – Neron

+0

да, вы сначала создаете CallableStatement, а затем пытаетесь применить к OracleCallableStatement, но вы должны создать OracleCallableStatement, и когда вы вызываете prepareCall (он возвращает CallableStatement), то бросайте ... разные. Я обновил свой ответ, проверьте его, что я имею в виду. – Sajmon

+0

Спасибо за ваш ответ, ты тоже прав, но в моей реализации это не проблема. Смотрите мой ответ, если хотите. И способ, которым вы получаете связь, не похож на мою. Мне нужно получить его из пула соединений weblogic. Я забыл сказать, что в моем вопросе, извините за то, что – Neron

-1

Я дам лучшее решение, один подход с использованием <wls:prefer-web-inf-classes>false</ wls:prefer-web-inf-classes > в weblogic.xml. Если вы хотите true вместо false в web-inf-classes, тогда другой подход удаляется ojdbcXX.jar в папке lib.При компиляции программы вы можете использовать любые ojdbcXX.jar в пути к классам. Но при развертывании удалите ojdbcXX.jar из lib. Чтобы сервер приложений weblogic использовал свой собственный ojdbc, он будет успешно работать без каких-либо ошибок.