我遇到了 setNetworkTimeout 应该根据Oracle解决的确切问题。一个查询在 socket.read() 中停留了几分钟。
但我不知道这个方法的第一个参数需要是什么。提交 null 会导致 AbstractMethodError 异常,所以......实现是否真的需要某种线程池来设置网络超时?
是否有某种方法可以在不为这种情况运行线程池的情况下达到相同的效果?
我遇到了 setNetworkTimeout 应该根据Oracle解决的确切问题。一个查询在 socket.read() 中停留了几分钟。
但我不知道这个方法的第一个参数需要是什么。提交 null 会导致 AbstractMethodError 异常,所以......实现是否真的需要某种线程池来设置网络超时?
是否有某种方法可以在不为这种情况运行线程池的情况下达到相同的效果?
似乎文档对此进行了可怕的解释,但是没有查看类背后的任何代码,我的猜测是您应该将 Executor 实例传递给该方法,以便实现可以产生作业/线程以检查状态连接。
由于连接读取会阻塞,为了实现任何类型的超时逻辑,除了读取线程之外,还需要另一个线程来检查连接的状态。
这听起来像是一个设计决定,而不是 JDBC 驱动程序在内部实现逻辑,如何/何时产生线程来处理这个,API 希望您作为客户端传递一个 Executor,该 Executor 将用于检查超时。这样,您作为客户端可以控制检查执行的频率,防止它在您的容器中产生比您喜欢的更多的线程等。
如果您周围还没有 Executor 实例,则可以创建一个默认实例:
conn.setNetworkTimeout(Executors.newFixedThreadPool(numThreads), yourTimeout);
就 Postgres JDBC 驱动程序(postgresql-42.2.2.jar)而言,setNetworkTimeout 实现不使用 Executor 参数。它只是使用 Socket.setSoTimeout 方法将指定的超时设置为底层套接字的超时。
看起来 java.sql.Connection 接口试图不对实现做出任何假设,并提供了一个执行器,如果实现需要它可以使用它。