为什么setNetworkTimeout会导致带函数的查询超时异常?

Why does setNetworkTimeout cause a timeout exception on queries with function?

我连接到 PostgreSQL 数据库(使用 PostgreSQL JDBC 驱动程序),并在其上设置了网络超时(使用 setNetworkTimeout 方法),这有点奇怪它。

当我将连接用于像 select * from table 这样需要花费大量时间的简单查询时,它工作正常(等待查询 return 结果)。 但是 当我将连接用于使用函数(如 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

(忽略查询逻辑。)

有人可以向我解释为什么会这样吗?

一旦结果行可用,PostgresSQL 就会将结果行流式传输到客户端。

在您的第一个查询中,第一个结果行将很快 returned,即使查询需要很长时间才能完成。 JDBC 驱动程序收集结果并等待查询完成,但网络连接不会再空闲。

第二个查询的完成时间与第一个查询的时间差不多,但它不能return它的第一个(也是唯一的)结果行,直到计算完连接的所有结果行。所以网络连接上有很长的空闲时间,导致超时。