将 Connection 类型转换为 OracleConnection 与 connection.unwrap(OracleConnection.class) 有何不同

How is typecasting Connection to OracleConnection different from connection.unwrap(OracleConnection.class)

将 java.sql.Connection 类型转换为 OracleConnection 与从 java.sql.Connection unwrap 方法获取 OracleConnection 有何不同。

此外,如果我通过 connection.unwrap(OracleConnection.class) 创建 OracleConnection,那么我应该在 finally 中关闭 OracleConnection 还是在 finally java.sql.Connection 中关闭 OracleConnection。

差异有些微妙但有意义。

如果实际实现对象与声明的 class 不兼容,类型转换将失败并返回 ClassCastException。 IE。如果实现不是 OracleConnection 并且您尝试对其进行类型转换,您将得到异常。

使用 unwrap(Class clazz) 将尝试查找指定类型的对象,并且 return 将尝试查找指定类型的对象,如果不可能,则使用 SQLException 失败。使用 Wrapper 接口方法的好处是您可以使用 isWrapperFor 方法提前检查 unwrap 是否会成功。