[英]Connect Oracle cloud DB in JAVA using SSH with Local port forward
[英]connect to DB using SSH java
我嘗試連接到 java 中的 Oracle DB,但我遇到了錯誤,我搜索了很多次我沒有找到對我有幫助的東西。
當我嘗試使用 SQL 開發人員連接時,它成功了。
所以我嘗試編寫 java 代碼來訪問數據庫,它成功連接到 SSH 但是當我到達conn = DriverManager.getConnection
時遇到錯誤:
“java.sql.SQLException:Io 異常:Oracle 錯誤 ORA-12650”
這是我的 function
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;
}
SSH 連接到端口 22。隧道的本地端口應該是不同的非保留端口,例如 61521。
然后使用 SQL*Net URL 中的本地地址和端口進行連接。
所以只顯示相關部分:
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) {
...
在您的 SQL Developer 屏幕截圖中,我希望第一個 Host 值是您的遠程主機,即您的代碼中實際存在的任何“sshHost”; 其中 SSH 在端口 22 上聯系。第二個主機和端口值是SSH session 到達數據庫偵聽器的方式,而不是您。 ('localhost' 是遠程服務器;它被視為本地主機,並到達環回地址 127.0.0.1)。 通過單選按鈕選擇,SSH 連接正在分配自己的本地端口,並連接到該端口,您並不需要知道它有什么值。
在您的代碼中,此調用:
jsch.getSession(sshuser, sshHost, 22);
這相當於 SQL 開發者對話框中的第一個主機和端口。 同樣, sshHost
是第一個主機框中的值。
然后這個電話:
session.setPortForwardingL(localPort, remoteHost, remotePort);
相當於 SQL Developer 屏幕截圖中的第二個主機和端口部分。 這里, remoteHost
是 Host 值,可能是localhost
; remotePort
是端口值,即 1521。
這與 SQL 開發人員設置的不同之處在於localPort
值。 在自動分配的 SQL 開發人員中(因為您選擇了“自動分配本地端口”)。 在您的代碼中,您指定的是您自己,並且該值必須是非保留端口。
因此,只需相關部分,您就可以執行以下操作:
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 對自身的內部引用。
更令人困惑的是,您的屏幕截圖顯示了兩個 Host 值的localhost
。 如果這就是你真正擁有的,那么它沒有多大意義,你根本不需要 SSH。 因此,我想您更改了真實值以隱藏它以進行發布,並且只是選擇了一個令人困惑的假值,而不是使用sshHost
或hostIP
或類似的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.