【发布时间】:2021-02-03 10:57:51
【问题描述】:
我在从 oracle 数据库接收 blob 字段时遇到了一个奇怪的问题:“SQLRecoverableException: Closed Connection
描述此异常的堆栈跟踪:
java.sql.SQLRecoverableException: Closed Connection
at oracle.jdbc.driver.OracleBlob.getDBAccess(OracleBlob.java:960) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at oracle.jdbc.driver.OracleBlob.getBinaryStream(OracleBlob.java:319) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at oracle.jdbc.driver.OracleBlob.getBinaryStream(OracleBlob.java:300) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at oracle.sql.BLOB.getBinaryStream(BLOB.java:316) ~[ojdbc8-19.3.0.0.jar:19.3.0.0.0]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_221]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_221]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_221]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_221]
at org.hibernate.engine.jdbc.SerializableBlobProxy.invoke(SerializableBlobProxy.java:60) ~[hibernate-core-5.3.18.Final.jar:5.3.18.Final]
at com.sun.proxy.$Proxy142.getBinaryStream(Unknown Source) ~[?:?]
at com.xxx.yyy.util.KeystoreHelper.loadKeyStore(KeystoreHelper.java:89) [cphcore-3.23.0.23-SNAPSHOT.jar:?]
at com.xxx.yyy.bp.job.substep.ProcessIF2Files.getChannelUnsealer(IFB2UnsealFiles.java:207) [classes/:?]
at com.xxx.yyy.bp.job.substep.ProcessIF2Files.access$4(IFB2UnsealFiles.java:198) [classes/:?]
at com.xxx.yyy.bp.job.substep.ProcessIF2Files$1.execute(IFB2UnsealFiles.java:86) [classes/:?]
at com.xxx.yyy.bp.job.substep.ProcessIF2Files$1.execute(IFB2UnsealFiles.java:1) [classes/:?]
源码:类KeystoreHelper方法loadKeyStore:
(...)
Blob keystoreBlob = keystore.getKeystoreData();
if (keystoreBlob == null || keystoreBlob.length() == 0) {
log.error("Keystore data is empty");
throw new KeystoreAccessException(keystore, "Keystore data is empty", null);
}
inputStream = keystore.getKeystoreData().getBinaryStream(); // line 89 - Exception
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
IOUtils.copy(inputStream, outputStream);
inputStream.close();
outputStream.close();
byte[] keystoreData = outputStream.toByteArray();
inputStream = new ByteArrayInputStream(keystoreData);
(...)
变量的源代码-keystore,类DbKeystore(实体),方法getKeystoreData:
(...)
private java.sql.Blob keystoreData;
public java.sql.Blob getKeystoreData() {
return this.keystoreData;
}
public void setKeystoreData(java.sql.Blob keystoreData) {
this.keystoreData = keystoreData;
}
(...)
你们中有人遇到过类似的问题吗? 感谢您的帮助:)
【问题讨论】:
-
很遗憾没有,顺序的变化 - .toByteArray() 没有任何变化
-
感谢您突出显示第 89 行,
keystore.getKeystoreData().getBinaryStream()。这导致了异常。不幸的是,“SQLRecoverableException”掩盖了“真正的”异常。问:getKeystoreData() 是否在自定义类中?您的组织编写的课程?问:你能用调试器进入那个类吗? -
1.你试过用不同的驱动(12c、18c、19c)吗 2.你试过ojdbc10.jar
-
感谢@paulsm4 的回答,我已将getKeystoreData() 方法的定义添加到主题中,抱歉缺少此内容。 - getKeystoreData 是简单的 getter 方法。
-
@devnull 由于 jdk 8 限制,我无法使用 ojdbc10.jar 或更新版本。我检查了 ojdbc8 的最新版本 - 版本 19.7.0.0,这个版本也存在问题