Как это реализовать в Java-коде?Java SSH Соединение с MySQL
ssh -L 1234:localhost:3306 mysql.server.remote
У меня есть Java настольное приложение с базой данных в общий сервер (Интернет), чтобы быть доступными отовсюду. Ребята, которые будут использовать программное обеспечение, не будут открывать терминалы для выполнения команд до и после использования программного обеспечения ...
Так что мне нужно решение для подключения моего приложения к базе данных при запуске приложения и удалении соединений (conn .close() и ssh), когда они закроют приложение. Для этого все это (код выше) должно быть внутри моего скрипта ... И это то, чего я не могу достичь ...
Я использовал JSch, и я успешно создал туннель SSH (на порту 22) , но никак не подключить MySQL ... Любая помощь приветствуется.
Весь код здесь:
public static void main(String[] args) throws SQLException {
String host="ssh.Mysite.com";
String rhost="localhost";
int rport=3306;
int lport=4321;
String user="userMysite.com";
String password="passMysite.com";
String dbuserName = "UserDB.com";
String dbpassword = "PassDB.com";
String url = "jdbc:mysql://localhost:3306/DB.com";
String driverName="com.mysql.jdbc.Driver";
Session session= null;
try{
//ssh tunnel creation
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "no");
JSch jsch = new JSch();
session=jsch.getSession(user, host, 22);
session.setPassword(password);
session.setConfig(config);
session.connect();
int assinged_port=session.setPortForwardingL(lport, rhost, rport);
//mysql database connect
Class.forName(driverName).newInstance();
dbConn = DriverManager.getConnection (url, dbuserName, dbpassword);
String sql = "SELECT * FROM client ";
PreparedStatement ps = dbConn.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
while (rs.next()){
System.out.println(rs.getString("name"));
}
}catch(JSchException e){
e.printStackTrace();
}finally{
if(dbConn != null && !dbConn.isClosed()){
dbConn.close();
}
if(session !=null && session.isConnected()){
session.disconnect();
}
}
}
Для тестирования я сделал следующий код:
String url = "jdbc:mysql://localhost:3306";
String driverName="com.mysql.jdbc.Driver";
Class.forName(driverName);
Connection dbConn = DriverManager.getConnection (url, dbuserName, dbpassword);
try {
ResultSet rs = dbConn.getMetaData().getCatalogs();
while (rs.next()) {
System.out.println("TABLE_CAT = " + rs.getString("TABLE_CAT"));
}
}catch(SQLException e){
e.printStackTrace();
}
Результаты:
localhost:3306
=> Печать мне все базы данных в локальном хосте моего компьютера ;
remote.server.mysql:3306
или remote.server.mysql:4321
или localhost:4321
=> ОШИБКА
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Спасибо!
Как вы можете подключиться к mysql в своем коде? –
измените его на 'jdbc: mysql: //mysql.server.remote: 3306/remoteDB' –
dbConn = DriverManager.getConnection (" jdbc: mysql: // localhost: 3306/remoteDB, dbuserName, dbpassword "); - после того, как туннель создается –