You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java通过SSH连接远程MariaDB失败:Socket连接异常求助

解决Java通过SSH连接MariaDB的连接失败问题

核心错误分析

你代码里的两个关键错误导致了连接失败:

  1. SSH端口转发参数错误:session.setPortForwardingL()的第三个参数应该是数据库的端口(3306),而不是SSH服务器的端口remoteSSHPort。这个方法的参数逻辑是:setPortForwardingL(本地端口, SSH服务器能访问的数据库主机地址, 数据库端口)。
  2. 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开启,获取更详细的连接失败细节。
  • SSH会话稳定性:确保SSH会话在数据库连接期间保持活跃,可设置心跳:session.setServerAliveInterval(60000);(每分钟发送一次心跳)。

内容的提问来源于stack exchange,提问作者Agustin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:03:31