JDBC未设置connectTimeout和socketTimeout导致线程挂起

时间:2024-03-25 12:43:36

现象:应用服务器到数据库的网络不通;启动应用后应用程序卡在数据库操作的地方;但是一般来京数据库操作都会有超时,如果连不上数据库或者慢查询耗时太久都应该报超时异常才对,为什么hang住不报异常呢?

我使用的spring mybatis框架,druid datasource,查看druid 配置并没数据库连接超时或者网络通信超时的配置。

排查过程:使用jps -lvm 查看正在运行的java进程ID 找到自己的应用程序id;然后jstack -l 进程ID查看

JDBC未设置connectTimeout和socketTimeout导致线程挂起

发现工作线程阻塞在了socketRead0()上;注意:
java.lang.Thread.StateRUNNABLE 指处于可运行状态的某一线程正在 Java 虚拟机中运行,但它可能正在等待操作系统中的其他资源,比如处理器。包括我们传统上讲的线程的运行和就绪状态。

那么这个超时时间是哪里设置的呢?java操作数据库应用层还是JDBC,查看JDBC参数果然有connectTimeout和socketTimeout,设置后,果然到指定时间就超出超时的异常了

 

 

推荐阅读https://zhuanlan.zhihu.com/p/43746959