急求,JAVA 多线查询ORACLE线程卡住 80C

因实际查询需要,系统设置40个线程进行数据查询,每个线程查询的时间会很长,都需要几十分钟的查询时间,当查询时间运行到一定的时间后,有些线程就卡在statement.executeQuery(),用jvisuallvm查看线程的执行点停留在java.net.SocketInputStream.socketRead0,再查看ORALCE的V$SESSION,这些线程提交的查询都已执行完成了,TOMCAT日志也没有任何异常记录,各位大神帮帮忙,看下问题会出在哪里。

6个回答

这个不关oracle底层的事情,并发查询是数据库的最基本功能之一。估计是你用ODBC API方式不对或者你的ODBC不支持数据库的多线程处理。从你的描述来看,串行可以,并行不行,应该是你用的API库不支持多线程并行。

shenpingjngs
shenpingjngs 如果查询时间短,是可以全部完成查询的。
接近 2 年之前 回复

每个线程的数据库连接有没有正确的关闭。

shenpingjngs
shenpingjngs 都进行了关闭,如果整个查询的时间不是很长的话,全部线程都成完成查询并汇总数据。
接近 2 年之前 回复

如果数据量再大点这样解决就会出现IO阻塞 死锁等问题 需要考虑分布式

shenpingjngs
shenpingjngs 没有出现死锁,而且每条语句ORACLE后台都执行完成,就是JAVA线程收不到执行的结果。
接近 2 年之前 回复

1、连接是否正确关闭
2、查询的表是否加了索引
3、可以贴下代码

这个现象很像tcp连接已经非正常断掉,确认一下java客户端到oracle中间的网络设备,会不会在socket限制一定时间后主动切断?

客户端的socket连接是ESTABLISHED状态,因为没收到tcp关闭相关的包,但是oracle端尝试输出结果的时候发现链接已经有问题了,用netstat看看客户端和服务端的连接数是不是对的上,对不上就是我说的这种情况了。

oracle的会话已经结束,而数据库连接池并没有接收到,有可能是因为odbc设置的最大等待时间比oracle的会话时间短,建议优化sql或修改等待时间尝试

meng20166
乐古 回复shenpingjngs: 是不是你的连接数设的太少导致线程阻塞了呢
接近 2 年之前 回复
shenpingjngs
shenpingjngs 我用tomcat dbcp连接池,jdbc连接,设置了statement.setquerytimeout 几个小时,如果超时会报异常,但是没有异常日志
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐