Соединение JDBC из хранимой процедуры Java, работающей в базе данных Oracle 12.2, не работает

Мы получаем сообщение об ошибке при попытке создать соединение с базой данных Oracle из хранимой процедуры Java, работающей в базе данных Oracle. Мы изолировали соединение, и оно работает с Oracle Database 12.1 под управлением Java 1.7. После обновления до Oracle Database 12.2 и Java 1.8 мы получаем следующее сообщение об ошибке.

ORA-29532: Java call terminated by uncaught Java exception: 
java.lang.RuntimeException: IO Error: The Network Adapter could not establish the connection 

Attempting to connect with: jdbc:oracle:thin@########
An error occurred in ###: java.sql.SQLRecoverableException: IO Error: The Network Adapter could not establish the connection 

Вот код, который мы используем для проверки соединения

import java.sql.Connection;
import java.sql.SQLException;
    
import oracle.jdbc.pool.OracleDataSource;

public class RemoteDBTest {
    
    public static String remoteConnection()
     throws SQLException
    {
      StringBuffer sb = new StringBuffer();
      String userId = "xxxx";
      String password = "xxxxx";
      String url = "jdbc:oracle:thin:@server:port/SID"; // Destination is a remote database. Actual host, port, and service have been replaced in this example.
      Connection conn = null;

      OracleDataSource ods = new OracleDataSource();
      ods.setUser(userId);
      ods.setPassword(password);
      ods.setURL(url);
      System.out.println(url);
      System.out.println(System.currentTimeMillis());
      try {
          conn = ods.getConnection();
      } catch (Exception e){
          System.out.println(System.currentTimeMillis());
          throw e;
      }
      System.out.println(System.currentTimeMillis());
      sb.append("Auto commit = " + conn.getAutoCommit());
      conn.close();
   
      return sb.toString();
    }

    public static void main(String[] args) {
        try{
           System.out.println(remoteConnection());
        } catch (SQLException e){
           e.printStackTrace();
        }
    }
}

Единственный работающий обходной путь на данный момент от поддержки Oracle — установить для свойства java.net.preferIPv4Stack значение true, однако при установке с помощью кода это увеличивает время выполнения соединения до 9 секунд. Мы попытались установить это свойство через командную строку и переменную среды _JAVA_OPTIONS, однако, похоже, это не влияет на JVM, выполняющую хранимую процедуру.

Любые идеи или предложения будут оценены.

Хост ОС: Windows Server 2016

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 — 64-разрядная производственная версия

Примечание. Это не дубликат ошибки ввода-вывода: Сетевому адаптеру не удалось установить соединение. Наши параметры соединения верны, и соединение будет успешным, если мы добавим System.setProperty("java.net.preferIPv4Stack" , "true"); в наш код. Однако, как отмечалось выше, это приводит к неприемлемому снижению производительности.


person Kent Anderson    schedule 18.08.2020    source источник
comment
@Abra Да, это хранимая процедура Java. Это не pl/sql.   -  person Kent Anderson    schedule 18.08.2020
comment
@Абра Ну вот   -  person Kent Anderson    schedule 18.08.2020
comment
@Abra - Вопрос гласит: We are getting an error message when attempting to create an Oracle db connection from Java code....   -  person Arvind Kumar Avinash    schedule 19.08.2020
comment
@KentAnderson. Согласно документации: If IPv6 is available on the operating system, the underlying native socket will be an IPv6 socket. This allows Java applications to connect to, and accept connections from, both IPv4 and IPv6 hosts. If an application has a preference to only use IPv4 sockets, then this property can be set to true. The implication is that the application will not be able to communicate with IPv6 hosts.   -  person Arvind Kumar Avinash    schedule 19.08.2020
comment
@KentAnderson. Вы можете найти эту страницу, эта страница и эта страница также полезна.   -  person Arvind Kumar Avinash    schedule 19.08.2020
comment
@KentAnderson - Согласно вашему редактированию, Ошибка ввода-вывода: Сетевому адаптеру не удалось установить соединение не отвечает на ваш вопрос. Поэтому я снова открыл вопрос.   -  person Arvind Kumar Avinash    schedule 19.08.2020
comment
Зачем вам нужно подключаться к другой базе данных Oracle из хранимой процедуры Java? Существует несколько способов взаимодействия двух экземпляров Oracle, например, ссылка на базу данных. Является ли использование хранимой процедуры Java единственным вариантом?   -  person Abra    schedule 19.08.2020
comment
Возможно, возможна расширенная организация очереди. вариант?   -  person Abra    schedule 19.08.2020
comment
@Abra Спасибо за предложения и помощь. К сожалению, у нас есть значительный объем существующего кода, использующего этот тип соединения.   -  person Kent Anderson    schedule 19.08.2020


Ответы (1)


Скорее всего, вы используете неверный URL-адрес jdbc:oracle:thin:@server:port/SID

Должно быть jdbc:oracle:thin:@serverhostname.com:1521/DB

@serverhostname.com имя хоста oracle db 1521 - это порт вашей базы данных (я думаю, 1521 по умолчанию) SID - DB должен быть SID вашей базы данных (узнайте правильный номер у администратора базы данных)

person Vlad Ulshin    schedule 18.08.2020
comment
Мы используем правильное имя хоста, порт и идентификатор базы данных. Я использовал эти значения в качестве заполнителей в своем опубликованном коде из соображений конфиденциальности. - person Kent Anderson; 18.08.2020