为什么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它的第一个(也是唯一的)结果行,直到计算完连接的所有结果行。所以网络连接上有很长的空闲时间,导致超时。
我连接到 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它的第一个(也是唯一的)结果行,直到计算完连接的所有结果行。所以网络连接上有很长的空闲时间,导致超时。