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