我正在使用jsch进行ssh连接和端口转发,我正在连接到MySQL . 它是动态连接 . 主机未修复,因此无法使用连接池 .

public void connect(String host, String username, String password,SshProperties sshProperies) throws SshException {
    if (port <= 0) {
        throw new IllegalArgumentException("Argument Port should be positive value");
    }
    if (StringUtils.isBlank(host)) {
        throw new IllegalArgumentException("Argument Host can not be null or blank");
    }
    try {
        JSch jsch = new JSch();
        session = jsch.getSession(username, host, port);
        session.setPassword(password);

        session.setConfig(STRICT_HOSTKEY_CHECKIN_KEY, STRICT_HOSTKEY_CHECKIN_VALUE);
        session.connect(100000);
        logger.info("Connection established to host:{} and port:{}", host, port);int assigned_port;
        assigned_port = session.setPortForwardingL("0.0.0.0", 0, sshProperies.getHost(), sshProperies.getDbPort());
        logger.info("Port forwording to host {} and port {}", sshProperies.getHost(), sshProperies.getDbPort());
        DBProperties dbprop = new DBProperties(host, assigned_port, sshProperies.getDbUsername(), sshProperies.getDbPassword());
        mysqlConnector.connect(dbprop);
        List<String> db = mysqlConnector.getDatabases();
    } catch (JSchException e) {
        logger.error("Error connecting to host {}", host, e);
        throw new SshException(e);
    }
}

对于mysql连接我使用这种方法

public void connect(DBProperties properties) throws ConnectorException {
    if (StringUtils.isBlank(properties.getIp())) {
        logger.error("Ip/Host cannont be null or empty");
        throw new IllegalArgumentException("Ip/Host cannont be null or empty");
    }
    if (properties.getPort() <= 0 && properties.getPort() >= 65536) {
        logger.error("Port should be inbetween 0 and 65536");
        throw new IllegalArgumentException("");
    }
    try {
        logger.debug("Connecting to MySQL DB");
        String url = "jdbc:mysql://" + properties.getUrl() + "?useSSL=false";
        logger.debug("Connecting to URL {}", url);
        connection = DriverManager.getConnection(url, properties.getUsername(), properties.getPassword());
        logger.debug("Connected to {} : {}", connection.getMetaData().getDatabaseProductName(), connection.getMetaData().getDatabaseProductVersion());
        if(!connection.getMetaData().getDatabaseProductVersion().contains(SUPPORTED_VERSION)){
            logger.error("MySQL version not supported {}",connection.getMetaData().getDatabaseProductVersion());
            throw new ConnectorException("MySQL version not supported", new UnsupportedClassVersionError("MySQL version not supported"));
        }
    } catch (SQLException e) {
        logger.error("Error while connecting {}", e);
        throw new ConnectorException("Invalid DB credentials", e);
    }
}

Error :com.mysql.cj.jdbc.exceptions.CommunicationsException:通信链路故障

从服务器成功接收的最后一个数据包是73毫秒前 . 成功发送到服务器的最后一个数据包是51毫秒前 . 在com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:590)在com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:57)在com.mysql.cj.jdbc .ConnectionImpl.execSQL(ConnectionImpl.java:1983)在com.mysql.cj.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.java:1421)在com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:2443)在com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1739)位于com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1596)的com.mysql.cj.jdbc.ConnectionImpl . (ConnectionImpl) .java:633)at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:347)at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:219)at java.sql.DriverManager . getConnection(DriverManager.java:664)位于com.sblele.common.connector.db.MySQLConnector_5_7_17.connec的java.sql.DriverManager.getConnection(DriverManager.java:247) t(MySQLConnector_5_7_17.java:53)位于com.baffle.common.connector.ssh.SshConnectorImpl.connectToDatabaseBySSH(SshConnectorImpl.java:111)的com.baffle.common.connector.ssh.SshConnectorImpl.lambda $ 0(SshConnectorImpl.java:139) )at com.baffle.common.connector.ssh.SshConnectorImpl $$ Lambda $ 1 / 230835489.run(Unknown Source)at java.lang.Thread.run(Thread.java:745)引起:com.mysql.cj.core .exceptions.CJCommunicationsException:通信链接失败

从服务器成功接收的最后一个数据包是73毫秒前 . 成功发送到服务器的最后一个数据包是51毫秒前 . at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor .newInstance(Constructor.java:422)在com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54)在com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:93 )在com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:133)在com.mysql.cj.core.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:149)在com.mysql.cj . mysqla.io.MysqlaProtocol.readPacket(MysqlaProtocol.java:527)在com.mysql.cj.mysqla.io.MysqlaProtocol.checkErrorPacket(MysqlaProtocol.java:723)在com.mysql.cj.mysqla.io.MysqlaProtocol.sendCommand( MysqlaProtocol.java:662)at com.mysql.cj.mysqla.io.MysqlaProtocol.s qlQueryDirect(MysqlaProtocol.java:950)位于com.mysql.cj.mysqla.MysqlaSession.sqlQueryDirect(MysqlaSession.java:431)com.mysql.cj.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:1974)... 14常见帧省略原因:java.io.EOFException:无法从服务器读取响应 . 预计读取4个字节,在连接意外丢失之前读取0个字节 . 在com.mysql.cj.core.io.FullReadInputStream.readFully(FullReadInputStream.java:61)在com.mysql.cj.mysqla.io.SimplePacketReader.readHeader(SimplePacketReader.java:60)在com.mysql.cj.mysqla位于com.mysql.cj.mysqla.io.MultiPacketReader.readHeader(MultiPacketReader.java:51)的.io.TimeTrackingPacketReader.readHeader(TimeTrackingPacketReader.java:48)at com.mysql.cj.mysqla.io.MysqlaProtocol.readPacket(MysqlaProtocol .java:521)...省略了19个常用帧

我认为当一个线程断开连接而其他线程正在尝试连接时会出现错误 .