glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet
Posted
技术标签:
【中文标题】glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet【英文标题】:glassfish 3.1.2 - ResultSetWrapper40 cannot be cast to oracle.jdbc.OracleResultSet 【发布时间】:2012-06-06 10:32:12 【问题描述】:我最近从 glassfish 3.1.1 迁移到 3.1.2 并收到以下错误
java.lang.ClassCastException: com.sun.gjc.spi.jdbc40.ResultSetWrapper40 cannot be cast to oracle.jdbc.OracleResultSet
在线上
oracle.sql.BLOB bfile = ((OracleResultSet) rs).getBLOB("filename");
在以下例程中:
public void fetchPdf(int matricola, String anno, String mese, String tableType, ServletOutputStream os)
byte[] buffer = new byte[2048];
String query = "SELECT filename FROM "
+ tableType + " where matricola = " + matricola
+ " and anno = " + anno
+ ((tableType.equals("gf_blob_ced") || tableType.equals("gf_blob_car")) ? " and mese = " + mese : "");
InputStream ins = null;
//--------
try
Connection conn = dataSource.getConnection();
//Connection conn = DriverManager.getConnection(connection, "glassfish", pwd);
java.sql.Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
if (rs.next())
logger.info("select ok " + query);
oracle.sql.BLOB bfile = ((OracleResultSet) rs).getBLOB("filename");
ins = bfile.getBinaryStream();
int length;
while ((length = (ins.read(buffer))) >= 0)
os.write(buffer, 0, length);
ins.close();
else
logger.info("select Nok " + query);
rs.close();
stmt.close();
//conn.close();
catch (IOException ex)
logger.warn("blob file non raggiungibile: "+query);
catch (SQLException ex)
logger.warn("connessione non riuscita");
我正在使用 glassfish 连接池
@Resource(name = "jdbc/ape4")
private DataSource dataSource;
jdbc/ape4资源属于oracle连接池,参数如下
NetworkProtocol tcp
LoginTimeout 0
PortNumber 1521
Password xxxxxxxx
MaxStatements 0
ServerName server
DataSourceName OracleConnectionPoolDataSource
URL jdbc:oracle:thin:@server:1521:APE4
User glassfish
ExplicitCachingEnabled false
DatabaseName APE4
ImplicitCachingEnabled false
oracle驱动是ojdbc6.jar,oracle DB是10g。
谁能帮我看看发生了什么?在 Glassfish 3.1.1 上它运行良好。
【问题讨论】:
【参考方案1】:在这段代码中没有必要不使用标准的 JDBC api。您没有使用任何特定于 Oracle 的功能,因此 rs.getBlob("filename").getBinaryStream()
也可以正常工作。
如果您坚持保留此信息,请为您的数据源关闭 JDBC Object wrapping 选项。
【讨论】:
谢谢。我关闭了 JDBC 对象包装,但我还必须将 DataSourceName 从 OracleConnectionPoolDataSource 更改为 OracleDataSource,并将资源类型更改为 javax.sql.DataSource 而不是 javax.sql.ConnectionPoolDataSource。使用不同的资源类型会有什么后果吗? @maxqua72 为什么不只使用 JDBC 标准方法。您的代码中没有任何内容要求您使用 Oracle 特定的方法。 是的,我会,但我也想了解。您的回答解决了我的问题,但我仍然有空缺来填补我对这个主题的知识。谢谢。 @maxqua72 需要将ConnectionPoolDatasource
更改为Datasource
,因为前者没有方法getConnection()
,只有getPooledConnection()
。 OracleConnectionPoolDatasource 实现了这两个接口。以上是关于glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet的主要内容,如果未能解决你的问题,请参考以下文章
glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet