我试图通过以下方式从glassfish获取OracleConnection:
EntityManager em = getEntityManager();
Connection c = em.unwrap(Connection.class);
但是,在调试器中我看到c的实际类是ConnectionHolder40类。哪里可以找到一个带有ConnectionHolder40定义的jar?
答案 0 :(得分:1)
您只能获得接口。如果使用Connection接口,您将在层次结构中获得实现Connection的第一个包装器,因此ConnectionHolder40就是这种情况。 如果你想获得OracleConnection - 我看到here它是一个接口,你应该要求它。
但是你需要一个JDBC4驱动程序。使用JDBC3驱动程序,您可能遇到问题(因为我使用Informix 3.70),因为它们没有实现unwrap和isWrapperFor方法,而且ConnectionHolder40,* StatementWrapper40和ResultSetWrapper40也没有正确实现。 如果我想从持有人中解开IfmxConnection,我可以。但我不能问持有者他是否是IfmxConnection的包装器 - 它会导致异常,因为它试图询问驱动程序实现:ConnectionHolder40。 StatementWrapper和ResultSetWrapper如果不直接实现接口,则抛出两个方法的异常(确切地说,如果你不要求java.sql。* Statement resp.java.sql.ResultSet)。
答案 1 :(得分:1)
尝试
public OracleConnection getOracleConnection(Connection connection) throws SQLException {
OracleConnection oconn = null;
try {
if (connection.isWrapperFor(oracle.jdbc.OracleConnection.class)) {
oconn = (OracleConnection) connection.unwrap(oracle.jdbc.OracleConnection.class)._getPC();
}
} catch (SQLException e) {
throw e;
}
return oconn;
}
答案 2 :(得分:0)
java.sql.Connection是一个接口,ConnectionHolder40只是Glassfish使用的连接包装器,它可能是一个生成的类,因此不会出现在任何jar文件中。
您应该只使用Connection API,因此不需要该类。
如果您想获得真正的JDBC驱动程序连接,JDBC还支持解包API。