gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:30:10 25 4
gpt4 key购买 nike

有人知道什么可能导致我的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com