Java-ошибка новичка при подключении ClassCastException к удаленной базе данных с использованием JDBC - PullRequest
0 голосов
/ 09 марта 2012

Кто-нибудь знает, что может быть причиной следующей ошибки RUN TIME в моей Java-программе при попытке доступа к базе данных Oracle на другом сервере Linux?

java.lang.ClassCastException : com.sun.gjc.spi.jdbc40.CallableStatementWrapper40 cannot be cast to oracle.jdbc.OracleCallableStatement

Я следил за обсуждением/ пример на страницах с 4-14 по 4-15 в Oracle JDBC Developer Guide (http://isu.ifmo.ru/docs/doc112/java.112/e10589.pdf).Я создал что-то похожее на этот пример, и он работал нормально.Затем я начал изменять его, чтобы перейти к приведенному ниже коду, и ввел GlassFish в процесс, и теперь я получаю эту ошибку.

Вот мой код Java:

public List<Report> GetReports(String var1, String var1, String var3) throws Exception {
    Connection conn;
    CallableStatement cs;
    ResultSet rset;
    String out1; 

    Context context = new InitialContext();
    DataSource ds = (DataSource)context.lookup("jdbc/myPool");
    conn = ds.getConnection();

    cs = conn.prepareCall( "{call my_proc (?,?,?,?,?)}" );

    cs.setString(1, var1);
    cs.setString(2, var2);
    cs.setString(3, var3);

    cs.registerOutParameter(4, Types.VARCHAR);
    cs.registerOutParameter(5, OracleTypes.CURSOR);

    cs.execute();

    out1 = cs.getString(4); 

    List<Report> userReports = new ArrayList<Report>();

    rset = ((OracleCallableStatement)cs).getCursor(5);
    while ( rset.next() ) {
        Report report = new Report();
        report.col1 = rset.getString("myCol1");
        report.col2 = rset.getString("myCol2");
        userReports.add(report);
    }

    if ( rset != null ) {
        try { rset.close(); } catch ( Exception ex ) {}
        rset = null;
    }

    if ( conn != null ) {
        try { conn.close(); } catch ( Exception ex ) {}
        conn = null;
    }

return userReports;
}

Ответы [ 3 ]

1 голос
/ 09 марта 2012

GlassFish по умолчанию включает то, что называется переносом оператора .С этой опцией все ваши операторы, наборы результатов и объекты метаданных базы данных будут помещены в прокси-объект.Обычно с этим нет проблем, потому что вы получаете доступ к этим объектам только через их стандартные интерфейсы JDBC, но если вам нужны специфические возможности вендора, вам придется предпринять дополнительные шаги, чтобы обойти этот прокси.* С другой стороны, это не похоже на то, что вам нужна специфичная для Oracle версия вызываемого оператора, приведение может быть совершенно лишним.для сервера Glassfish .

0 голосов
/ 09 марта 2012

Вероятно, есть несколько способов решить эту проблему, но следующее изменение кода выше работает для меня.Заменить это утверждение:

rset = ((OracleCallableStatement)cs).getCursor(5);

этим утверждением:

rset = (ResultSet) cs.getObject(5);
0 голосов
/ 09 марта 2012

Проблема в том, что вы определили переменную как

CallableStatement cs;

, а затем навели ее на

rset = ((OracleCallableStatement)cs).getCursor(5);

* CallableStatement - это суперинтерфейс OracleCallableStatement, и вы можете 'Это супер-интерфейс к его дочернему элементу (вы можете сделать наоборот).Вы должны иметь возможность просто изменить cs на OracleCallableStatement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...