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