Java 为什么setNetworkTimeout会导致函数查询出现超时异常?

Java 为什么setNetworkTimeout会导致函数查询出现超时异常?,java,postgresql,jdbc,timeout,pg-jdbc,Java,Postgresql,Jdbc,Timeout,Pg Jdbc,我有一个到PostgreSQL数据库的连接(使用PostgreSQL JDBC驱动程序),我在它上面设置了网络超时(使用setNetworkTimeout方法),它有点奇怪 当我使用连接进行简单的查询时,如select*fromtable,这需要花费很多时间,它工作正常(等待查询返回结果)但是当我将连接用于使用函数(如从表中选择max(a))的查询时,它会抛出一个异常,导致超时 示例代码: // Queries which takes more than 5 seconds String big

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

当我使用连接进行简单的查询时,如
select*fromtable
,这需要花费很多时间,它工作正常(等待查询返回结果)但是当我将连接用于使用函数(如
从表
中选择max(a))的查询时,它会抛出一个异常,导致超时

示例代码:

// 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会在结果行可用时将其流式传输到客户端

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

完成第二个查询所需的时间与完成第一个查询所需的时间大致相同,但在计算完联接中的所有结果行之前,它无法返回其第一个(也是唯一一个)结果行。因此,网络连接上存在较长的空闲时间,这会导致超时