从 Oracle、PLSQL 调用 Java 导致 oracle.aurora.vm.ReadOnlyObjectException [英] Calling Java from Oracle, PLSQL causing oracle.aurora.vm.ReadOnlyObjectException

查看:46
本文介绍了从 Oracle、PLSQL 调用 Java 导致 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆