GlassFish 3.1.1 - 获取jdbc连接

时间:2011-09-26 13:50:45

标签: jpa jdbc glassfish

我试图通过以下方式从glassfish获取OracleConnection:

EntityManager em = getEntityManager();
Connection c = em.unwrap(Connection.class);

但是,在调试器中我看到c的实际类是ConnectionHolder40类。哪里可以找到一个带有ConnectionHolder40定义的jar?

3 个答案:

答案 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。