Java通过SSH连接远程MariaDB失败:Socket连接异常求助
解决Java通过SSH连接MariaDB的连接失败问题
核心错误分析
你代码里的两个关键错误导致了连接失败:
- SSH端口转发参数错误:
session.setPortForwardingL()的第三个参数应该是数据库的端口(3306),而不是SSH服务器的端口remoteSSHPort。这个方法的参数逻辑是:setPortForwardingL(本地端口, SSH服务器能访问的数据库主机地址, 数据库端口)。 - JDBC URL主机错误:端口转发是将本地端口映射到SSH服务器后的数据库地址,所以JDBC应该连接
localhost(本地转发端口),而不是原serverHost。
修正后的代码示例
public Connection connectToDB() throws Exception { // 先确认SSH会话处于连接状态 if (!session.isConnected()) { throw new IllegalStateException("SSH会话未建立"); } // 修正端口转发:本地端口用0让JSch自动分配可用端口,第二个参数是SSH内网能访问的数据库主机(比如localhost如果同机) int assignedPort = session.setPortForwardingL(0, "localhost", 3306); // JDBC URL改为连接本地转发端口,添加日志参数方便排查 String url = "jdbc:mariadb://localhost:" + assignedPort + "/" + database + "?logger=SLF4J&log=true"; return DriverManager.getConnection(url, userSQL, passwordSql); }
额外排查建议
- 端口占用检查:如果指定固定本地端口(比如3307),先确认该端口未被其他进程占用;用0自动分配可避免这个问题。
- 数据库权限验证:确保数据库用户允许从SSH服务器的IP地址访问(因为通过SSH转发后,数据库看到的连接来源是SSH服务器)。
- 开启调试日志:
- JSch开启调试:在
session.connect()前添加session.setConfig("LogLevel", "DEBUG");,查看端口转发是否成功建立。 - MariaDB JDBC日志:通过URL参数
?logger=SLF4J&log=true开启,获取更详细的连接失败细节。
- JSch开启调试:在
- SSH会话稳定性:确保SSH会话在数据库连接期间保持活跃,可设置心跳:
session.setServerAliveInterval(60000);(每分钟发送一次心跳)。
内容的提问来源于stack exchange,提问作者Agustin
相关产品推荐
相关产品推荐

