2012-06-06 1 views
0

Недавно я мигрировать из GlassFish 3.1.1 на 3.1.2 и я получил следующее сообщение об ошибкеGlassFish 3.1.2 - ResultSetWrapper40 не может быть приведен к oracle.jdbc.OracleResultSet

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

на линии

oracle.sql.BLOB bfile = ((OracleResultSet) rs).getBLOB("filename"); 

в следующей рутине:

public void fetchPdf(int matricola, String anno, String mese, String tableType, ServletOutputStream os) { 
    byte[] buffer = new byte[2048]; 
    String query = "SELECT filename FROM " 
       + tableType + " where matricola = " + matricola 
       + " and anno = " + anno 
       + ((tableType.equals("gf_blob_ced") || tableType.equals("gf_blob_car")) ? " and mese = " + mese : ""); 

    InputStream ins = null; 

    //-------- 
    try { 

     Connection conn = dataSource.getConnection(); 
     //Connection conn = DriverManager.getConnection(connection, "glassfish", pwd); 
     java.sql.Statement stmt = conn.createStatement(); 
     ResultSet rs = stmt.executeQuery(query); 
     if (rs.next()) { 
      logger.info("select ok " + query); 
      oracle.sql.BLOB bfile = ((OracleResultSet) rs).getBLOB("filename"); 

      ins = bfile.getBinaryStream(); 

      int length; 
      while ((length = (ins.read(buffer))) >= 0) { 
       os.write(buffer, 0, length); 
      } 

      ins.close(); 

     } else { 
      logger.info("select Nok " + query); 
     } 
     rs.close(); 
     stmt.close(); 
     //conn.close(); 

    } catch (IOException ex) { 
     logger.warn("blob file non raggiungibile: "+query); 
    } catch (SQLException ex) { 
     logger.warn("connessione non riuscita"); 
    } 
} 

Я использую бассейн GlassFish соединения

@Resource(name = "jdbc/ape4") 
    private DataSource dataSource; 

и JDBC/ape4 ресурс принадлежит к соединительным оракулу пулу со следующими парами

NetworkProtocol tcp 
LoginTimeout 0 
PortNumber 1521 
Password xxxxxxxx 
MaxStatements 0 
ServerName server 
DataSourceName OracleConnectionPoolDataSource 
URL jdbc:oracle:thin:@server:1521:APE4 
User glassfish 
ExplicitCachingEnabled false 
DatabaseName APE4 
ImplicitCachingEnabled false 

Драйвер оракула ojdbc6.jar, Oracle БД 10g.

Может ли кто-нибудь помочь мне в том, что происходит? На Glassfish 3.1.1 он работал нормально.

ответ

3

В этом коде нет необходимости использовать стандартный JDBC api. Вы не используете какие-либо функциональные возможности Oracle, поэтому rs.getBlob("filename").getBinaryStream() будет работать так же хорошо.

Если вы настаиваете на сохранении этого параметра, отключите опцию JDBC Object wrapping для вашего источника данных.

+0

Спасибо. Я отключил обертку объекта JDBC, но также мне нужно было chenge DataSourceName из OracleConnectionPoolDataSource в OracleDataSource и тип ресурса в javax.sql.DataSource вместо javax.sql.ConnectionPoolDataSource. Существуют ли какие-либо последствия с использованием другого типа ресурса? – maxqua72

+0

@ maxqua72 Почему бы просто не использовать стандартные методы JDBC. Ничто в коде не требует использования специальных методов Oracle. –

+0

Да, я хочу, но я тоже хотел бы понять. Ваш ответ исправил мою проблему, но у меня все еще есть дыры, чтобы заполнить мои знания об этой теме. Благодарю. – maxqua72