glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet

Posted

技术标签:

【中文标题】glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet【英文标题】:glassfish 3.1.2 - ResultSetWrapper40 cannot be cast to oracle.jdbc.OracleResultSet 【发布时间】:2012-06-06 10:32:12 【问题描述】:

我最近从 glassfish 3.1.1 迁移到 3.1.2 并收到以下错误

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资源属于oracle连接池,参数如下

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 DB是10g。

谁能帮我看看发生了什么?在 Glassfish 3.1.1 上它运行良好。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

谢谢。我关闭了 JDBC 对象包装,但我还必须将 DataSourceName 从 OracleConnectionPoolDataSource 更改为 OracleDataSource,并将资源类型更改为 javax.sql.DataSource 而不是 javax.sql.ConnectionPoolDataSource。使用不同的资源类型会有什么后果吗? @maxqua72 为什么不只使用 JDBC 标准方法。您的代码中没有任何内容要求您使用 Oracle 特定的方法。 是的,我会,但我也想了解。您的回答解决了我的问题,但我仍然有空缺来填补我对这个主题的知识。谢谢。 @maxqua72 需要将ConnectionPoolDatasource 更改为Datasource,因为前者没有方法getConnection(),只有getPooledConnection()。 OracleConnectionPoolDatasource 实现了这两个接口。

以上是关于glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet的主要内容,如果未能解决你的问题,请参考以下文章

glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet

气氛无法在 Glassfish 3.1.2 上获得会话

GlassFish 3.1.2 在部署时提供 404 而没有任何错误

glassfish3新建domain

GlassFish服务器安装可执行文件无法打开

Glassfish 管理控制台可以拥有多个具有特定权限的用户吗?