从 Oracle、PLSQL 调用 Java 导致 oracle.aurora.vm.ReadOnlyObjectException [英] Calling Java from Oracle, PLSQL causing oracle.aurora.vm.ReadOnlyObjectException
问题描述
我的问题与此主题有关 从 PLSQL 调用 Java导致 oracle.aurora.vm.ReadOnlyObjectException
从今天起,当从 PLSQL 执行 Java 代码时,我们的生产中突然出现错误,请注意我们有时会出现此错误,但不知道为什么,过去删除所有类并重新加载它们解决了这个问题,但这次没有:
Oracle Database 12c 企业版 12.1.0.2.0 版 - 64 位生产
java.version = 1.6.0_71
sonic_Client = 8.6.0
PROCEDURE LOG_AND_SEND_TO_QUEUE_PR(消息 VARCHAR2,客户 ID VARCHAR2,类型消息 VARCHAR2,providerUrl VARCHAR2,目标 VARCHAR2,usr VARCHAR2,密码 VARCHAR2,isTopic VARCHAR2,ENABLED_HTTPS_ALGORITHM VARCHAR2 )作为语言 Java 名称 'jms.cxmessenger.SonicSender.doSend(java.lang.String, java.lang.String,java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.Stringlang.String, java.lang.String, java.lang.String)';
jms.cxmessenger.SecureTrustManager 由 SonicMQ 客户端使用的系统属性设置.
package jms.cxmessenger;导入 java.security.KeyStore;导入 java.security.cert.CertificateException;导入 java.security.cert.X509Certificate;导入 java.util.Arrays;导入 java.util.List;导入 java.util.NoSuchElementException;导入 javax.naming.InvalidNameException;导入 javax.naming.NamingException;导入 javax.naming.directory.Attribute;导入 javax.naming.directory.Attributes;导入 javax.naming.ldap.LdapName;导入 javax.naming.ldap.Rdn;导入 javax.net.ssl.TrustManager;导入 javax.net.ssl.TrustManagerFactory;导入 javax.net.ssl.X509TrustManager;公共类 SecureTrustManager 实现 X509TrustManager {private static final X509Certificate[] EMPTY_X509CERTIFICATE_ARRAY = new X509Certificate[0];private CustomDefaultHostnameVerifier verifier = new CustomDefaultHostnameVerifier();私人 TrustManager[] trustManagers;{尝试 {TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());trustManagerFactory.init((KeyStore) null);trustManagers = trustManagerFactory.getTrustManagers();} 捕获(异常 e){抛出新的运行时异常(e);}}public void check(X509Certificate[] chain, String authType) 抛出 CertificateException {布尔信任 = 假;if (chain.length > 0) {for (TrustManager trustManager : trustManagers) {尝试 {if (trustManager instanceof X509TrustManager) {/* 第 43 行 */((X509TrustManager) trustManager).checkServerTrusted(chain, authType);//第 43 行信任 = 真;}} catch (CertificateException e) {}}}if (!trusted && !Boolean.getBoolean("DEACTIVATE_HOSTNAME_VALIDATION")) {检查CN(链);}}public X509Certificate[] getValidCertificates(X509Certificate[] chain, String peerHost) {返回 verifier.getValidCertificates(chain, peerHost);}私有无效 checkCN(X509Certificate[] 链) 抛出 CertificateException {if (Boolean.getBoolean("DEBUG")) {System.out.println("checkCN(X509Certificate[] 链):" + Arrays.toString(chains));}StringBuilder sb = new StringBuilder();for (int i = 0; i = 0; i--) {最终 Rdn rds = rdns.get(i);最终属性属性 = rds.toAttributes();final Attribute cn = attributes.get("cn");如果 (cn != null) {尝试 {最终对象值 = cn.get();如果(值!= null){返回值.toString();}} catch (final NoSuchElementException 忽略) {} catch(最终NamingException忽略){}}}} catch (final InvalidNameException e) {}返回空;}@覆盖public void checkClientTrusted(X509Certificate[] 证书,字符串 paramString) 抛出 CertificateException {对于(X509Certificate 证书:证书){证书.checkValidity();}检查(证书,paramString);}@覆盖public void checkServerTrusted(X509Certificate[] 证书,字符串 paramString) 抛出 CertificateException {对于(X509Certificate 证书:证书){证书.checkValidity();}检查(证书,paramString);}@覆盖公共 X509Certificate[] getAcceptedIssuers() {返回 trustManagers != null &&trustManagers.length >0 &&trustManagers[0] 实例 X509TrustManager?((X509TrustManager) trustManagers[0]).getAcceptedIssuers() : EMPTY_X509CERTIFICATE_ARRAY;}}
<块引用>
javax.net.ssl.SSLException:oracle.aurora.vm.ReadOnlyObjectException在 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java) 在com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java)在com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java)在com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java)在com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java)在com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java)在 jms.cxmessenger.JSSESSLImpl.createSSLSocket(JSSESSLImpl.java) 在jms.cxmessenger.JSSESSLImpl.createSSLSocket(JSSESSLImpl.java:69) 在progress.message.net.ssl.ProgressSslSocket.(ProgressSslSocket.java)在progress.message.net.ssl.ProgressSslSocket.(ProgressSslSocket.java:163)在progress.message.net.ssl.ProgressSslSocketFactory.createProgressSocket(ProgressSslSocketFactory.java:172)在progress.message.net.ProgressSocketFactory.createProgressSocket(ProgressSocketFactory.java:180)在progress.message.zclient.Connection.openSocket(Connection.java:3660)在progress.message.zclient.Connection.connectWithRecoveryOpt(Connection.java)在progress.message.zclient.ReconnectHelper.connectAndChaseSingleFailoverRedirect(ReconnectHelper.java:534)在progress.message.zclient.ReconnectHelper.connect(ReconnectHelper.java)在 progress.message.zclient.Connection.connect(Connection.java:1585)在 progress.message.jimpl.Connection.(Connection.java:886) 在progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316)在 jms.cxmessenger.SonicSender.doSend(SonicSender.java:73)
原因:oracle.aurora.vm.ReadOnlyObjectException 在jms.cxmessenger.SecureTrustManager.check(SecureTrustManager.java:43)在jms.cxmessenger.SecureTrustManager.checkServerTrusted(SecureTrustManager.java)在com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java)在com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java)在com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java)在com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java)在com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java)在com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java)……还有 16 个
有人可以帮忙吗
问题是缺少一些 SYS Java 类!!
公共同义词在那里,但后面没有类.
解决方案是重新安装 SYS Java 类,一切顺利!
My problem is linked to this topic Calling Java from PLSQL causing oracle.aurora.vm.ReadOnlyObjectException
All of a sudden since today we are getting an error in our Production when a Java code is being executed from PLSQL, note that we have this error sometimes and don't know why, in past by deleting all classes and reloads them solved the issue but this time not :
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
java.version = 1.6.0_71
sonic_Client = 8.6.0
PROCEDURE LOG_AND_SEND_TO_QUEUE_PR(
msg VARCHAR2,
clientID VARCHAR2,
typeMessage VARCHAR2,
providerUrl VARCHAR2,
destination VARCHAR2,
usr VARCHAR2,
pwd VARCHAR2,
isTopic VARCHAR2,
ENABLED_HTTPS_ALGORITHM VARCHAR2 )
AS
LANGUAGE JAVA NAME 'jms.cxmessenger.SonicSender.doSend(java.lang.String, java.lang.String,java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)';
jms.cxmessenger.SecureTrustManager is set by System property used by SonicMQ client.
package jms.cxmessenger;
import java.security.KeyStore;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.List;
import java.util.NoSuchElementException;
import javax.naming.InvalidNameException;
import javax.naming.NamingException;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.ldap.LdapName;
import javax.naming.ldap.Rdn;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
public class SecureTrustManager implements X509TrustManager {
private static final X509Certificate[] EMPTY_X509CERTIFICATE_ARRAY = new X509Certificate[0];
private CustomDefaultHostnameVerifier verifier = new CustomDefaultHostnameVerifier();
private TrustManager[] trustManagers;
{
try {
TrustManagerFactory trustManagerFactory = TrustManagerFactory
.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
trustManagers = trustManagerFactory.getTrustManagers();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void check(X509Certificate[] chain, String authType) throws CertificateException {
boolean trusted = false;
if (chain.length > 0) {
for (TrustManager trustManager : trustManagers) {
try {
if (trustManager instanceof X509TrustManager) {
/* line 43 */ ((X509TrustManager) trustManager).checkServerTrusted(chain, authType);//line 43
trusted = true;
}
} catch (CertificateException e) {
}
}
}
if (!trusted && !Boolean.getBoolean("DEACTIVATE_HOSTNAME_VALIDATION")) {
checkCN(chain);
}
}
public X509Certificate[] getValidCertificates(X509Certificate[] chain, String peerHost) {
return verifier.getValidCertificates(chain, peerHost);
}
private void checkCN(X509Certificate[] chains) throws CertificateException {
if (Boolean.getBoolean("DEBUG")) {
System.out.println("checkCN(X509Certificate[] chains) : " + Arrays.toString(chains));
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < chains.length; i++) {
String cn = extractCN(chains[i].getIssuerX500Principal().getName());
if (cn == null) {
sb.append("\n\tFailed to authenticate Server CA : Name = "
+ chains[i].getIssuerX500Principal().getName());
} else {
return;
}
}
if (Boolean.getBoolean("DEBUG")) {
System.out.println("sb.toString : " + sb.toString());
}
throw new CertificateException(sb.toString());
}
private String extractCN(final String subjectPrincipal) {
if (subjectPrincipal == null) {
return null;
}
try {
final LdapName subjectDN = new LdapName(subjectPrincipal);
final List<Rdn> rdns = subjectDN.getRdns();
for (int i = rdns.size() - 1; i >= 0; i--) {
final Rdn rds = rdns.get(i);
final Attributes attributes = rds.toAttributes();
final Attribute cn = attributes.get("cn");
if (cn != null) {
try {
final Object value = cn.get();
if (value != null) {
return value.toString();
}
} catch (final NoSuchElementException ignore) {
} catch (final NamingException ignore) {
}
}
}
} catch (final InvalidNameException e) {
}
return null;
}
@Override
public void checkClientTrusted(X509Certificate[] certificates, String paramString) throws CertificateException {
for (X509Certificate certificate : certificates) {
certificate.checkValidity();
}
check(certificates, paramString);
}
@Override
public void checkServerTrusted(X509Certificate[] certificates, String paramString) throws CertificateException {
for (X509Certificate certificate : certificates) {
certificate.checkValidity();
}
check(certificates, paramString);
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return trustManagers != null && trustManagers.length > 0 && trustManagers[0] instanceof X509TrustManager
? ((X509TrustManager) trustManagers[0]).getAcceptedIssuers() : EMPTY_X509CERTIFICATE_ARRAY;
}
}
javax.net.ssl.SSLException: oracle.aurora.vm.ReadOnlyObjectException at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.handleException(SSLSocketImpl.java) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java) at jms.cxmessenger.JSSESSLImpl.createSSLSocket(JSSESSLImpl.java) at jms.cxmessenger.JSSESSLImpl.createSSLSocket(JSSESSLImpl.java:69) at progress.message.net.ssl.ProgressSslSocket.(ProgressSslSocket.java) at progress.message.net.ssl.ProgressSslSocket.(ProgressSslSocket.java:163) at progress.message.net.ssl.ProgressSslSocketFactory.createProgressSocket(ProgressSslSocketFactory.java:172) at progress.message.net.ProgressSocketFactory.createProgressSocket(ProgressSocketFactory.java:180) at progress.message.zclient.Connection.openSocket(Connection.java:3660) at progress.message.zclient.Connection.connectWithRecoveryOpt(Connection.java) at progress.message.zclient.ReconnectHelper.connectAndChaseSingleFailoverRedirect(ReconnectHelper.java:534) at progress.message.zclient.ReconnectHelper.connect(ReconnectHelper.java) at progress.message.zclient.Connection.connect(Connection.java:1585) at progress.message.jimpl.Connection.(Connection.java:886) at progress.message.jclient.ConnectionFactory.createConnection(ConnectionFactory.java:2316) at jms.cxmessenger.SonicSender.doSend(SonicSender.java:73)
Caused by: oracle.aurora.vm.ReadOnlyObjectException at jms.cxmessenger.SecureTrustManager.check(SecureTrustManager.java:43) at jms.cxmessenger.SecureTrustManager.checkServerTrusted(SecureTrustManager.java) at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java) at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java) ... 16 more
Can some one help
the problem was that there is some SYS Java classes missing !!
the public synonyms was there but there is no classes behind.
The solution was to reinstall the SYS Java classes and everything goes well!
这篇关于从 Oracle、PLSQL 调用 Java 导致 oracle.aurora.vm.ReadOnlyObjectException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!