oracle连接卡住,导致程序不运行

一 、概况

采用springboot的jpa读取oracle的数据,大概300万数据,运行一天左右之后,程序卡死,导致数据接入接不完。

二、排查思路

java生产级别的接入程序卡死是正常的,基本重启就可以解决问题,但是重启之后还是会卡死,所以要排查原因,找到源头。

基本的思路就是查看代码堆栈,是否是线程死锁、遇到阻塞队列、或者线程池线程因为内存不足退出等。

基本使用的工具包括jstack命令查看堆栈,jconsole查看线程状态及内存状态,jvisualvm查看内存数据及线程运行情况等

三、采用jstack查看接入代码卡住的部分

      执行jstack pid,具体核心部分如下:

                              

        通过上述的堆栈可以看出,代码卡在socket读取数据的部分,并且锁住了一个oracle连接(这个地方是导致执行了kill -15 之后,程序不退出的原因)。

        这就奇怪了,代码明明设置了超时时间的呢,那咋回事???,狂搜百度,无果,这个时候肯定想看下oracle.jdbc.driver.T4CConnection这个对象内部的值等。

四、如何看jvm对象的值

        通过jdk提供的工具jvisualvm,可以分析jvm的内存占用情况及其对象的值等,是不是很强大,哈哈

                                           

                                     

        通过上述oracle连接对象的内存分析,发现有thinNetConnectionTimeOut和thinReadTimeOut两个参数,第一个设置为30000ms,第二个为null,原来是没设置读取超时啊。

五、如何设置oracle连接的读取超时

启动的时候,在jvm参数里面添加-Doracle.jdbc.ReadTimeout=1800000即可。

六、kill -15为什么杀不死程序

       kill -15是安全退出进程机制,没有kill -9 这么暴力,此次未推出的原因如下:

                                   

       jvm接收到推出的命令之后,springboot的jpa连接池会回收掉oracle的连接,但是由于上述第三章内容,代码卡在读取数据,连接被上了锁,所以回收线程一直处于阻塞状态,导致进程一直推出不了。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章