【发布时间】:2022-02-01 22:03:06
【问题描述】:
package com.soul.db;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import java.sql.Connection;
public class JdbcSSHConnection {
/**
* Java Program to connect to remote database through SSH using port forwarding
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
int lport=443;
String rhost="10.99.69.10";
String host="10.105.27.201";
int rport=3306;
String user="root";
String password="SysPassword1";
String dbuserName = "root";
String dbpassword = "DBPassword1";
String url = "jdbc:mysql://localhost:"+lport+"/proj_db";//"jdbc:mysql://localhost:3306", "root", "mysql"
String driverName="com.mysql.jdbc.Driver";
Connection conn = null;
Session session= null;
try{
//Set StrictHostKeyChecking property to no to avoid UnknownHostKey issue
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();
System.out.println("Connected");
int assinged_port=session.setPortForwardingL(lport,rhost, rport);
System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
System.out.println("Port Forwarded");
//mysql database connectivity
Class.forName(driverName).newInstance();
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection (url, "root", "DBPassword1");
// step3 create the statement object
Statement stmt = conn.createStatement();
System.out.println ("Database connection established");
// step4 execute query
ResultSet rs = stmt.executeQuery("select DISTINCT STUD_NAME from STUD_DETAILS;");
while (rs.next())
System.out.println(rs.getString(1));
// step5 close the connection object
conn.close();
//System.out.println ("Database connection established");
// System.out.println("DONE");
}catch(Exception e){
e.printStackTrace();
}finally{
if(conn != null && !conn.isClosed()){
System.out.println("Closing Database Connection");
conn.close();
}
if(session !=null && session.isConnected()){
System.out.println("Closing SSH Connection");
session.disconnect();
}
}
}
}
我在我的 windows 机器上安装了 SSH 安全 shell 客户端。我正在尝试连接安装在 linux 机器上的 mysql 服务器。
现在我得到以下错误:
已连接 本地主机:443 -> 10.99.69.10:3306 端口转发 com.mysql.jdbc.CommunicationsException:由于底层异常导致通信链接失败:
** 开始嵌套异常 **
com.mysql.jdbc.CommunicationsException 消息:由于底层异常导致通信链接失败:
** 开始嵌套异常 **
java.io.EOFException 消息:无法从服务器读取响应。预计读取 4 个字节,在连接意外丢失之前读取 0 个字节。
堆栈跟踪:
java.io.EOFException:无法从服务器读取响应。预期读取 4 个字节,在连接意外丢失之前读取 0 个字节。 在 com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997) 在 com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:573) 在 com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1044) 在 com.mysql.jdbc.Connection.createNewIO(Connection.java:2775) 在 com.mysql.jdbc.Connection.(Connection.java:1555) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) 在 java.sql.DriverManager.getConnection(未知来源) 在 java.sql.DriverManager.getConnection(未知来源) 在 com.soul.db.JdbcSSHConnection.main(JdbcSSHConnection.java:54)
** 结束嵌套异常 **
最后一个发送到服务器的数据包是 0 毫秒前。
堆栈跟踪:
com.mysql.jdbc.CommunicationsException:由于底层异常导致通信链接失败:
** 开始嵌套异常 **
java.io.EOFException 消息:无法从服务器读取响应。预计读取 4 个字节,在连接意外丢失之前读取 0 个字节。
堆栈跟踪:
java.io.EOFException:无法从服务器读取响应。预期读取 4 个字节,在连接意外丢失之前读取 0 个字节。 在 com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997) 在 com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:573) 在 com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1044) 在 com.mysql.jdbc.Connection.createNewIO(Connection.java:2775) 在 com.mysql.jdbc.Connection.(Connection.java:1555) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) 在 java.sql.DriverManager.getConnection(未知来源) 在 java.sql.DriverManager.getConnection(未知来源) 在 com.soul.db.JdbcSSHConnection.main(JdbcSSHConnection.java:54)
** 结束嵌套异常 **
最后一个发送到服务器的数据包是 0 毫秒前。 在 com.mysql.jdbc.MysqlIO.readPacket(MysqlIO.java:641) 在 com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1044) 在 com.mysql.jdbc.Connection.createNewIO(Connection.java:2775) 在 com.mysql.jdbc.Connection.(Connection.java:1555) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) 在 java.sql.DriverManager.getConnection(未知来源) 在 java.sql.DriverManager.getConnection(未知来源) 在 com.soul.db.JdbcSSHConnection.main(JdbcSSHConnection.java:54)
** 结束嵌套异常 **
最后一个发送到服务器的数据包是 0 毫秒前。 在 com.mysql.jdbc.Connection.createNewIO(Connection.java:2847) 关闭 SSH 连接 在 com.mysql.jdbc.Connection.(Connection.java:1555) 在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) 在 java.sql.DriverManager.getConnection(未知来源) 在 java.sql.DriverManager.getConnection(未知来源) 在 com.soul.db.JdbcSSHConnection.main(JdbcSSHConnection.java:54)
【问题讨论】:
-
你解决了吗?我也面临同样的问题