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 连接的主要内容,如果未能解决你的问题,请参考以下文章
glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet