Java SSH MySQL 连接 [英] Java SSH MySQL connection
问题描述
我如何在 Java 代码中实现它?
How can I implement this in Java code?
ssh -L 1234:localhost:3306 mysql.server.remote
我有一个 Java 桌面应用程序,数据库位于共享服务器(互联网)中,可以从任何地方访问.会用软件的小伙伴不会开终端执行命令前后会用软件...
I have a Java desktop application with the database in a shared server (internet) to be accessible from everywhere. The guys that will use the software will not open terminals to execute commands before and after will use the software...
所以我需要一个解决方案来在应用程序启动时将我的应用程序与数据库连接,并在它们关闭应用程序时终止连接(conn.close() 和 ssh).为此,所有这些(上面的代码)都应该在我的脚本中......这是我无法实现的......
So I need a solution to connect my application with the database when the application starts and kill the connections (conn.close(), and ssh) when they will close the application. For that, all this (the code above) should be inside my script... And this is what i cannot achieve...
我使用了 JSch,并且成功创建了 SSH 隧道(在端口 22 上),但无法连接 MySQL...欢迎任何帮助.
I've used JSch, and I successfully create the SSH tunnel (on port 22), but no way to connect MySQL... Any help it's welcome.
这里的全部代码:
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();
}
}
}
出于测试目的,我编写了以下代码:
For test purposes i made the following code:
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
=> 打印我电脑本地主机中的所有数据库;
localhost:3306
=> Print me all the databases in my computer's localhost;
remote.server.mysql:3306
or remote.server.mysql:4321
or localhost:4321
=> ERROR
remote.server.mysql:3306
or remote.server.mysql:4321
or localhost:4321
=> ERROR
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败最后一个成功发送到服务器的数据包是 0 毫秒前.驱动程序没有收到来自服务器的任何数据包.
谢谢!
推荐答案
您可以尝试从 Java 运行 ssh 二进制文件吗?例如:
Could you try running ssh binary from Java? For example:
Runtime rt = Runtime.getRuntime();
Process pr = rt.exec("ssh -L 1234:localhost:3306 mysql.server.remote");
显然,这需要系统在 PATH 中安装 ssh.
Obviously, that requires a system to have ssh installed in a PATH.
这篇关于Java SSH MySQL 连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!