Hive JDBC - утечка соединения при сбое getConnection - PullRequest
0 голосов
/ 21 мая 2019

Я использую улей cloudera jdbc https://www.cloudera.com/downloads/connectors/hive/jdbc/2-6-2.html

Иногда, когда не удается вызвать getConnection () (не всегда, это зависит от стабильности сервера), выдается следующее исключение:

MyDAO - Cannot create connection from DataSource@21f421b8 
at com.cloudera.hiveserver2.hivecommon.api.HS2Client.closeSession(Unknown Source)
at com.cloudera.hiveserver2.hivecommon.core.HiveJDBCCommonConnection.establishConnection(Unknown Source)
at com.cloudera.hiveserver2.jdbc.core.LoginTimeoutConnection.connect(Unknown Source)
at com.cloudera.hiveserver2.jdbc.common.BaseConnectionFactory.doConnect(Unknown Source)
at com.cloudera.hiveserver2.jdbc.common.AbstractDataSource.getSimbaConnection(Unknown Source)
at com.cloudera.hiveserver2.jdbc.common.AbstractDataSource.getConnection(Unknown Source)

А когда я проверяю с помощью netstat cmd:

netstat -an --tcp --program

Установлено новое сокетное соединение, мне нужно подождать около часа, чтобы увидеть, что соединение tcp пропало.

Вопрос:

  1. Почему, когда я вызываю getConnection (), вызывается closeSession ()?
  2. Это из-за сбоя closeSession (), соединение tcp не может быть освобождено? Это считается утечкой соединения?

1 Ответ

0 голосов
/ 05 июля 2019

Я декомпилировал драйвер, проверьте класс H2SClient:

public void closeSession() throws ErrorException {
    if (this.m_hasOpenSession) {
        try {
            TCloseSessionReq var1 = new TCloseSessionReq();
            var1.setSessionHandle(this.m_openSessionResp.getSessionHandle());
            this.m_client.CloseSession(var1);
            if (null != this.m_client && null != this.m_client.getInputProtocol() && null != this.m_client.getInputProtocol().getTransport()) {
                this.m_client.getInputProtocol().getTransport().close(); //line 8
            }

            this.m_hasOpenSession = false;
        } catch (Exception var3) {
            ErrorException var2 = HiveJDBCCommonDriver.s_HiveMessages.createGeneralException(HiveJDBCMessageKey.CONN_SESSION_ERR.name(), "Close Session Error");
            var2.initCause(var3);
            throw var2;
        }
    }

}

Если есть какое-либо исключение, которое делает невозможным доступ к строке 8, соединение сокета не закрывается.Это закрытие должно вызываться также в блоке catch или, наконец, в блоке:

public void closeSession() throws ErrorException {
    if (this.m_hasOpenSession) {
        try {
            TCloseSessionReq var1 = new TCloseSessionReq();
            var1.setSessionHandle(this.m_openSessionResp.getSessionHandle());
            this.m_client.CloseSession(var1);

            var2.initCause(var3);
            throw var2;
        } finally {
            if (null != this.m_client && null != this.m_client.getInputProtocol() && null != this.m_client.getInputProtocol().getTransport()) {
                this.m_client.getInputProtocol().getTransport().close(); //line 8
            }   
        }
    }
}
...