Мы используем драйвер 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, и все данные фиксируются в таблице даже после истечения времени ожидания.
Вопросы - Как работает тайм-аут? Есть ли в этом случае какие-либо попытки повторного подключения или восстановления соединения? Если драйвер инициирует команду отмены, будет ли запрос отмены в БД гарантирован с откатом или это зависит? Как лучше обрабатывать связанные с таймаутом исключения в коде?
Спасибо заранее за помощь.