java - 使用 JDBC 连接到远程数据库时出现 ClassCastException 的新手 java 错误

标签 java jdbc

有人知道什么可能导致我的 Java 程序在尝试访问不同 Linux 服务器上的 Oracle 数据库时出现以下运行时错误吗?

java.lang.ClassCastException:com.sun.gjc.spi.jdbc40.CallableStatementWrapper40 无法转换为 oracle.jdbc.OracleCallableStatement

我正在关注 Oracle 的 JDBC 开发人员指南 ( http://isu.ifmo.ru/docs/doc112/java.112/e10589.pdf ) 第 4-14 至 4-15 页上的讨论/示例。我创建了与该示例类似的东西,并且效果很好。然后我开始修改它以获取以下代码并将 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;
}

最佳答案

GlassFish 默认启用称为“语句包装”的功能。启用此选项后,您的语句、结果集和数据库元数据对象都将包装在“代理”对象中。通常这没有问题,因为您只能通过标准 JDBC 接口(interface)访问这些对象,但如果您需要供应商特定的功能,那么您将需要采取额外的步骤来通过此“代理”。

Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("jdbc/myPool");
conn = ds.getConnection();
conn = ds.getConnection(conn); // <-- 'Unwrap' the vendor specific connection

顺便说一句,您似乎不需要 Oracle 特定版本的可调用语句,强制转换可能完全是多余的。

您可以在Oracle Development Guide for Glassfish Server上阅读有关语句包装的更多信息。 .

关于java - 使用 JDBC 连接到远程数据库时出现 ClassCastException 的新手 java 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628758/

相关文章:

Java:为堆栈中上面的方法检索它

java - 将按钮的旧 ActionListener 替换为新的 ActionListener

java - 从平面列表生成嵌套列表(树)

java - jTable更新按钮并添加新的

java - 手动将数据添加到 Java ResultSet

java - Java : How to Differ Inserted/Updated/NoChange states 上的 MySQL "INSERT ... ON DUPLICATE KEY UPDATE"

java - JDBC - 如何在 MySQL 数据库中插入和检索泰米尔语值

Java Swing JMenu 不断消失

java - 如何在 Apache tomcat 服务器启动时自动定期运行我的 java 函数?

java - 在其他电脑上 java.sql.SQLException : No suitable driver found for jdbc:sqlserver