Почему setNetworkTimeout вызывает исключение тайм-аута при запросах с функцией? - PullRequest
1 голос
/ 12 апреля 2019

У меня есть соединение с БД PostgreSQL (с помощью драйвера JDBC PostgreSQL), и я установил для него сетевое время ожидания (с помощью метода setNetworkTimeout), и в этом есть что-то странное.

Когда я использую соединение для простых запросов, таких как select * from table, что занимает много времени, оно работает нормально (ждет, пока запрос вернет результат). Но , когда я использую соединение для запросов, использующих функции (например, select max(a) from table), которые также занимают много времени, в результате тайм-аута возникает исключение.

пример кода:

// Queries which takes more than 5 seconds
String bigQuery = "select * from data.bigtable tb1 inner join data.bigtable tb2 on tb1.a like '%a%'";
String bigQueryWithFunction = "select max(tb1.a) from data.bigtable tb1 inner join data.bigtable tb2 on tb1.a like '%a%'";

// Creating a connection with 5 seconds network timeout
Connection con = source.getConnection();
con.setNetworkTimeout(Executors.newSingleThreadExecutor(), 5000);
con.setAutoCommit(false);

Statement st2 = con.createStatement();
st2.execute(bigQueryWithFunction); // This line DOES throws an exception
st2.execute(bigQuery);             // This line DOES NOT throws an exception

(Игнорировать логику запросов.)

Может кто-нибудь объяснить мне, почему это происходит?

1 Ответ

2 голосов
/ 12 апреля 2019

PostgresSQL направляет результирующие строки клиенту, как только они становятся доступными.

В вашем первом запросе первая строка результата будет возвращена довольно скоро, даже если для завершения запроса требуется много времени,Драйвер JDBC собирает результаты и ждет, пока запрос не будет выполнен, но сетевое соединение не будет простаивать в течение более длительного времени.

Второй запрос выполняется примерно так же долго, как первый, но онне может вернуть свою первую (и единственную) строку результата, пока не будут вычислены все строки результата из объединения.Таким образом, существует большое время простоя в сетевом соединении, которое вызывает тайм-аут.

...