S SH подключается к порту 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 "на самом деле присутствует в вашем коде; который S SH связывается с портом 22. Вторые значения Host и Port показывают, как прослушиватель базы данных достигает сеанса S SH, а не вами. ('localhost' - это удаленный сервер; что он видит как локальный хост и достигает адреса обратной связи 127.0.0.1). При выборе переключателя это соединение S SH выделяет свой собственный локальный порт и подключается к нему, и вам действительно не нужно знать, какое у него значение.
В вашем коде этот вызов :
jsch.getSession(sshuser, sshHost, 22);
это эквивалент первого узла и порта в диалоговом окне разработчика SQL. Опять же, sshHost
- это значение в этом первом поле Host.
Тогда этот вызов:
session.setPortForwardingL(localPort, remoteHost, remotePort);
эквивалентен второму разделу Host и Port в вашем SQL скриншоте разработчика . Здесь remoteHost
- это значение хоста, возможно, localhost
; и remotePort
- значение порта, равное 1521.
Отличие от настройки SQL Developer - это значение localPort
. В SQL Developer, который назначается автоматически (потому что вы выбрали «автоматически назначать локальный порт»). В вашем коде вы указываете себя, и это значение должно быть незарезервированным портом.
Таким образом, используя только соответствующие части, вы делаете что-то вроде:
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()
) в качестве внутренней ссылки вашего P C на сам .
Еще больше сбивает с толку то, что ваш снимок экрана показывает localhost
для обоих хостов ценности. Если это то, что у вас действительно есть, тогда это не имеет особого смысла, и вам вообще не нужно S SH. Итак, я предполагаю, что вы изменили реальное значение, чтобы скрыть его для публикации, и просто выбрали сбивающее с толку фальшивое значение вместо использования sshHost
или hostIP
или аналогичных.