2012-06-06 50 views
0

近日笔者从GlassFish的3.1.1迁移到3.1.2,我在该行的GlassFish 3.1.2 - ResultSetWrapper40不能转换到oracle.jdbc.OracleResultSet

oracle.sql.BLOB bfile = ((OracleResultSet) rs).getBLOB("filename"); 
得到了以下错误

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

在以下程序:

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资源属于Oracle连接池具有以下PARAM

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 

Oracle驱动程序是ojdbc6.jar,Oracle数据库为10g。

任何人都可以帮助我发生什么?在Glassfish 3.1.1上工作正常。

回答

3

在此代码中不需要使用标准的JDBC API。您没有使用任何Oracle特定的功能,因此rs.getBlob("filename").getBinaryStream()也可以正常工作。

如果您坚持保留此选项,请关闭您的数据源的JDBC Object wrapping选项。

+0

谢谢。我关闭了JDBC对象包装,但也必须将DataSourceName从OracleConnectionPoolDataSource转换为OracleDataSource,将资源类型转换为javax.sql.DataSource而不是javax.sql.ConnectionPoolDataSource。使用不同资源类型会产生什么后果? – maxqua72

+0

@ maxqua72为什么不使用JDBC标准方法。你的代码中没有任何东西需要你使用Oracle特定的方法。 –

+0

是的,我会但我想明白。你的回答解决了我的问题,但我仍然有漏洞来填补我对这个主题的认识。谢谢。 – maxqua72