GlassFish 3.1.1 - 获取 jdbc 连接

Posted

技术标签:

【中文标题】GlassFish 3.1.1 - 获取 jdbc 连接【英文标题】:GlassFish 3.1.1 - getting jdbc connection 【发布时间】:2011-09-26 13:50:44 【问题描述】:

我正在尝试通过以下方式从 glassfish 获取 OracleConnection:

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

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

【问题讨论】:

【参考方案1】:

您只能获取接口。如果您使用 Connection 接口,您将在层次结构中获得第一个实现 Connection 的包装器,因此 ConnectionHolder40 就是这种情况。 如果您想获得 OracleConnection - 我看到 here 它是一个接口,您应该要求它。

但是您需要一个 JDBC4 驱动程序。使用 JDBC3 驱动程序可能会遇到问题(就像我使用 Informix 3.70 时一样),因为它们没有实现 unwrap 和 isWrapperFor 方法,而且 ConnectionHolder40、*StatementWrapper40 和 ResultSetWrapper40 也没有正确实现。 如果我想从持有人那里解开 IfmxConnection,我可以。但是我不能问持有人他是否是 IfmxConnection 的包装器 - 它会导致异常,因为它试图询问驱动程序实现:ConnectionHolder40。如果 StatementWrapper 和 ResultSetWrapper 不直接实现接口(确切地说,如果您不要求 java.sql.*Statement 和 java.sql.ResultSet),则这两种方法都会抛出异常。

【讨论】:

【参考方案2】:

试试

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;

【讨论】:

【参考方案3】:

java.sql.Connection 是一个接口,ConnectionHolder40 只是 Glassfish 使用的连接包装器,它可能是一个生成的类,所以不会在任何 jar 文件中。

您应该只使用 Connection API,因此不需要该类。

如果您想获得真正的 JDBC 驱动程序连接,JDBC 还支持 unwrap API。

【讨论】:

我必须使用 db 中的 clob/blob 数据,据我所知,使用 clob/blob 字段的唯一方法是使用真实连接。我想做类似的事情:Connection c = em.unwrap(Connection.class); CLOB clob = CLOB.createTemporary(c,false, CLOB.DURATION_SESSION); clob.open(CLOB.MODE_READWRITE); Writer w = clob.getCharacterOutputStream(); w.append("asdfasdfasdf\n"); w.append("asdfasdfasdf\n"); w.append("asdfasdfasdf\n"); w.flush(); w.close(); clob.close();

以上是关于GlassFish 3.1.1 - 获取 jdbc 连接的主要内容,如果未能解决你的问题,请参考以下文章

JDBC连接池设置无法在Glassfish5上运行

Mysql/Glassfish 资源 jdbc 无效

Glassfish中的JDBC连接池ping错误

glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet

无法使用Glassfish3上的JDBC连接到数据库

Glassfish“连接已关闭”错误与连接池、JDBC 和 SQL Server 2008