Мы получаем сообщение об ошибке при попытке создать соединение с базой данных 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");
в наш код. Однако, как отмечалось выше, это приводит к неприемлемому снижению производительности.
We are getting an error message when attempting to create an Oracle db connection from Java code...
. - person Arvind Kumar Avinash   schedule 19.08.2020If 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