Simba JDBC Driver连接BigQuery出现Read timed out超时问题求解
问题根因
- Simba BigQuery JDBC驱动未实现JDBC标准的
setNetworkTimeout接口,因此Hikari连接池调用该方法会抛出不支持异常,同时标准JDBC超时配置对该驱动无效 - 此前设置的全局超时未生效,是因为未使用驱动专属的配置参数,驱动层面的HTTP Socket通信超时、作业超时需通过Simba专属参数配置
解决方案
配置驱动专属超时参数
需将以下参数添加到JDBC连接URL,或作为连接属性透传给驱动,参数名大小写敏感,写错会导致配置不生效:参数名 含义 单位 推荐值 SocketTimeoutBigQuery服务端通信的Socket读取超时 毫秒 360000(即6分钟) ConnectTimeout建立到BigQuery服务连接的超时 毫秒 30000 TimeoutBigQuery作业执行的最大超时时间 秒 360 示例JDBC URL:
jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;ProjectId=你的项目ID;OAuthType=3;SocketTimeout=360000;Timeout=360;若使用doobie构造连接,需将参数放入
Properties对象中传入DriverManagerTransactor的构造方法,确保参数被正确透传给底层驱动。关闭Hikari连接池的网络超时检测
在Hikari配置中添加如下配置,避免连接池调用驱动未实现的getNetworkTimeout/setNetworkTimeout接口:val hikariConfig = new HikariConfig() hikariConfig.setNetworkTimeout(-1) // 其余Hikari配置保持不变添加作业重试机制
针对偶发的网络波动导致的Socket超时,可以在doobie作业逻辑外层添加重试逻辑,基于cats-effect的重试能力仅针对SocketTimeoutException进行有限次重试:import cats.effect._ import cats.implicits._ import retry._ val retryPolicy = limitRetries[IO](3) |+| constantDelay[IO](2.seconds) val queryTask: IO[List[QueryResult]] = // 你的doobie查询逻辑 retryOn( queryTask, retryPolicy, (e: Throwable, _) => IO.pure(e.isInstanceOf[java.net.SocketTimeoutException]) )
内容的提问来源于stack exchange,提问作者Damien Marsile
相关产品推荐
相关产品推荐

