我试着用java连接到Oracle DB,但是我遇到了错误,我搜索了很多次,我没有找到帮助我的东西。
当我尝试使用连接时,它的成功。
因此,我尝试编写java代码来访问DB,它成功地连接到SSH,但是当到达conn = DriverManager.getConnection时,我遇到了错误。
"java.sql.SQLException: Io异常: Oracle ORA-12650“
这是我的职责
public static Connection sshTunel() {
String sshHost = "sshHost";
String sshuser = "sshUser";
String SshKeyFilepath =
"pathOfKey";
Session session;
int localPort = 22;
String remoteHost = "HostIp";
int remotePort = 1521;
String usr = "DB user";
String pwd = "DB pass";
try {
java.util.Properties config = new java.util.Properties();
JSch jsch = new JSch();
session = jsch.getSession(sshuser, sshHost, 22);
jsch.addIdentity(SshKeyFilepath, "ssh Pass");
config.put("StrictHostKeyChecking", "no");
config.put("Compression", "yes");
config.put("ConnectionAttempts", "2");
session.setConfig(config);
session.connect();
System.out.println("SSH Connected ...");
int assinged_port =
session.setPortForwardingL(localPort, remoteHost, remotePort);
System.out.println("localhost:" + assinged_port + " -> " +
remoteHost + ":" + remotePort);
System.out.println("Port Forwarded ...");
try {
Class.forName("oracle.jdbc.pool.OracleDataSource");
conn =
DriverManager.getConnection("jdbc:oracle:thin:@remoteHost:1521/SID",
"DB User", "DB Pass");
} catch (SQLException ex) {
ex.printStackTrace();
System.out.println("Error in connection");
}
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}


发布于 2020-07-10 20:30:41
SSH连接到端口22。隧道的本地端口应该是不同的、无保留的端口,例如61521.
然后,为连接使用SQL*Net中的本地地址和端口。
因此,只显示有关部分:
int localPort = 61521;
String remoteHost = "HostIp";
int remotePort = 1521;
...
try {
java.util.Properties config = new java.util.Properties();
JSch jsch = new JSch();
session = jsch.getSession(sshuser, sshHost, 22);
...
session.setConfig(config);
session.connect();
System.out.println("SSH Connected ...");
int assinged_port =
session.setPortForwardingL(localPort, remoteHost, remotePort);
System.out.println("localhost:" + assinged_port + " -> " +
remoteHost + ":" + remotePort);
try {
Class.forName("oracle.jdbc.pool.OracleDataSource");
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:61521/service_name",
"DB User", "DB Pass");
} catch (SQLException ex) {
...在屏幕截图中,我希望第一个主机值是您的远程主机,即代码中的任何`sshHost‘;SSH在端口22上联系的那个主机。第二个主机和端口值是SSH会话,而不是由您访问数据库侦听器的方式。(“localhost”有远程服务器;它将本地主机视为本地主机,并在环回地址127.0.0.1上到达)。WIth单选按钮选择,SSH连接正在分配它自己的本地端口,并连接到它,您不需要真正知道它有什么值。
在您的代码中,此调用:
jsch.getSession(sshuser, sshHost, 22);这相当于SQL对话框中的第一个主机和端口。同样,sshHost是第一个主机框中的值。
然后这个电话:
session.setPortForwardingL(localPort, remoteHost, remotePort);相当于screenhot屏幕中的第二个主机和端口部分。这里,remoteHost是主机值,概率是localhost;remotePort是端口值,为1521。
与SQL设置不同的地方是localPort值。在selected中,将自动分配(因为您已经选择了“自动分配本地端口”)。在您的代码中,您指定的是您自己,而该值必须是一个非保留端口。
因此,对于相关部分,您所做的事情如下:
jsch.getSession(sshuser, 'your_remote_host', 22);
session.connect();
session.setPortForwardingL(61521, 'localhost', 1521);
DriverManager.getConnection(
"jdbc:oracle:thin:@localhost:61521/service_name"对于localhost有两个引用,并且它们的含义似乎略有不同,这可能有点令人困惑。这是因为它是一个特殊的环回地址,驻留在计算机中(因此是“本地”)。您可以认为第一个(在setPortForwaringL中)是远程服务器对自身的内部引用;第二个(在getConnection()中)可以看作是PC对自身的内部引用。
更令人困惑的是,屏幕截图显示了两个主机值的localhost。如果这是您真正拥有的,那么它就没有多大意义,您应该根本不需要SSH。因此,我猜想您更改了真实值以隐藏它以供发布,只是选择了一个令人困惑的假值,而不是使用sshHost或hostIP或类似的。
https://stackoverflow.com/questions/62837731
复制相似问题