Я пытаюсь настроить источник данных, используя S SH для доступа к базе данных из IntelliJ вне кампуса. Конфигурация такая, как показано на скриншотах, и я получил
[08006] [17002] Ошибка ввода-вывода: получен минус один при вызове чтения, ошибка соединения 30003 мс, ошибка аутентификации 0 мс. oracle. net .ns.NetException: Получен минус один из вызова чтения.
Фактически мне удалось подключиться к БД с помощью loginProxy()
и loginDB()
в программе Java. После запуска кода я знал, что jdbcPort должен быть динамически c, и я предполагаю, что это также должно быть заполнено в поле «Порт» на вкладке «Общие» в окне конфигурации «Источник данных и драйверы».
Итак, возникает проблема, как я могу настроить ее, если порт, который нужно заполнить, это DYNAMI C? Или я что-то не так понял, чтобы на самом деле был другой подход?
Дополнительный вопрос: String URL = "jdbc:oracle:thin:@" + jdbcHost + ":" + jdbcPort + "/" + database;
Какой формат URL здесь используется? Он не похож на SID, Service Name или TNS, но он работает ... и забавно, что когда я заменяю "/" на ":", который соответствует формату SID, он больше не работает. ..
/**
* Login the proxy. Do not change this function.
*
* @return boolean
*/
public boolean loginProxy() {
if (getYESorNO("Using ssh tunnel or not?")) { // if using ssh tunnel
String[] namePwd = getUsernamePassword("Login cs lab computer");
String sshUser = namePwd[0];
String sshPwd = namePwd[1];
try {
proxySession = new JSch().getSession(sshUser, proxyHost, proxyPort);
proxySession.setPassword(sshPwd);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
proxySession.setConfig(config);
proxySession.connect();
proxySession.setPortForwardingL(forwardHost, 0, databaseHost, databasePort);
forwardPort = Integer.parseInt(proxySession.getPortForwardingL()[0].split(":")[0]);
// ? forwardPort is set here, seems to be dynamic...
} catch (JSchException e) {
e.printStackTrace();
return false;
}
jdbcHost = forwardHost; // ? this is used in case of SSH connection, which is "localhost"
jdbcPort = forwardPort; // ? this is used in case of SSH connection
} else {
jdbcHost = databaseHost;
jdbcPort = databasePort;
}
return true;
}
/**
* Login the oracle system. Change this function under instruction.
*
* @return boolean
*/
public boolean loginDB() {
String username = "myDBUsername";
String password = "myDBPassword";
/* Do not change the code below */
String URL = "jdbc:oracle:thin:@" + jdbcHost + ":" + jdbcPort + "/" + database;
try {
System.out.println("Logging " + URL + " ...");
conn = DriverManager.getConnection(URL, username, password);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}