Как обработать тайм-аут запроса для Snowflake jdb c? - PullRequest
0 голосов
/ 18 апреля 2020

Мы используем драйвер JDB C для подключения к Snowflake и выполнения вставок. Использование setQueryTimeout для prepareStatement для получения желаемого поведения тайм-аута. Автоматическая фиксация сохраняется по умолчанию, т.е. включена.

Мы наблюдаем, что драйвер по тайм-ауту пытается отменить запрос, однако запрос все еще фиксирует данные в таблице.
Ниже приведен пример программы, которая использует 1 секунду в качестве тайм-аута для Быстро воспроизводимый сценарий -

boolean flag = false;
PreparedStatement ps = connection.prepareStatement("insert into Test_Int values (?)");
ps.setQueryTimeout(1);
for (int v =1; v<200; v++) {
    ps.setInt(1, v);
    ps.addBatch();
    flag = true;
    if(v%50 == 0) {
        try {
            ps.executeBatch();
            flag = false;
        } catch (SQLException se) {
            //do not stop execution continue with other batches
        }
    }
}
if(flag) {
    try {
        ps.executeBatch();
    } catch (SQLException se) {
            //do not stop execution continue with other batches
    }   
}   

В соответствии с требованием мы продолжаем следующий пакет на SQLException, и все данные фиксируются в таблице даже после истечения времени ожидания.

Вопросы - Как работает тайм-аут? Есть ли в этом случае какие-либо попытки повторного подключения или восстановления соединения? Если драйвер инициирует команду отмены, будет ли запрос отмены в БД гарантирован с откатом или это зависит? Как лучше обрабатывать связанные с таймаутом исключения в коде?

Спасибо заранее за помощь.

...