尝试从运行在oracle数据库中的java存储过程创建oracle db连接时,我们收到一条错误消息。我们已经隔离了连接,它正在使用oracle数据库12.1,运行java1.7。自从升级到oracledatabase12.2和java1.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秒。我们试图通过命令行和\u java\u options环境变量设置这个属性,但是,它似乎不会影响运行存储过程的jvm。
如有任何意见或建议,将不胜感激。
主机操作系统:windows server 2016
oracle database 12c enterprise edition 12.2.0.1.0版-64位产品
注意:这不是io错误的重复:网络适配器无法建立连接。我们的连接参数是正确的,如果我们添加 System.setProperty("java.net.preferIPv4Stack" , "true");
我们的代码。但是,如上所述,这会带来不可接受的性能开销。
1条答案
按热度按时间oprakyz71#
很可能您使用了错误的url“jdbc:oracle:thin:@server:端口/sid“
应jdbc:oracle:thin:@serverhostname.com:1521/分贝
@serverhostname.com oracle db 1521的主机名是数据库的一个端口(我认为1521是默认值)sid-db应该是数据库的一个sid(向数据库管理员询问正确的sid)