解决C# WinForm程序与Oracle连接界面长时间没有响应的问题

程序情况:
C#编写的WinForm程序(用户管理系统),后端WCF服务为其提供数据,与Oracle相关的操作在WCF服务器完成。
遇到问题:最近有用户报告异常,描述WinForm的某个搜索界面(去调用WCF服务在Oracle中查找数据)一直处于等待状态。DBA那边也有人报告,一些调用该用户管理系统相关的存储过程的oracle session,一直处于运行状态3个小时,对oracle数据库造成了影响,需要手动结束掉这些进程。


最终找到的原因:
Oracle数据库的表中突然的插入了大批量的数据,导致查询变慢。然后用户在WinForm界面检索的时候,点击了搜索按钮,此时会调用WCF服务去检索数据库,但是检索很慢,用户在等待了3分钟后不想再等待,便直接关掉了界面。注意这个过程中, WinForm在与WCF的连接中,虽然强迫关闭了客户端,但是WCF的服务端代码运行到了一半,正在等待Oracle的返回结果,WCF端并没有关闭,还是在一直运行的状态,与Oracle的connection一直是连接状态。


先说一说Oracle吧,如果C#调用其一个存储过程,会建立一个connection,或者说session,Oracle有自动清理inactive session的机制,虽然不是实时的,但是有这个机制。如果C#与Oracle的session是持续的,那么这个session就不会被清理掉。如果说C#调用了一个耗时的存储过程,但是半途中C#退出了,那么这个session就会变成inactive session,就会在合适的时候被Oracle清理掉。


现在这个问题是,用户在Winform界面退出了,但是在WCF中还是在执行着,所以WCF服务器与Oracle的连接一直是active session,所以存储过程在执行了3个小时,还在执行。而且这时候,用户又打开了新的WinForm界面,再次尝试查询,WCF又会打开新的与Oracle session, 直到conncetion pool中可用的被用完(或者是Oracle服务器最多能同时接受的连接达到最大值),WCF服务端与Oracle会话就会处于等待可用连接的状态,然后WinForm界面自然就处于等待没有响应的状态。


解决办法:
给WCF在连接Oracle的代码中增加timeout属性,当执行超过5分钟的时候,自动断掉连接,之后Oracle中的inactive session就会被清除,而且C# WCF服务端的connection pool也会够用,不会再出现等待状态。


数据库中存储过程与查询慢的原因:
这个表的数据量很大,而且刚刚有大批量的数据进来。Oracle有时候遇到这个问题,同样的查询语句,上一次执行的很慢,下一次可能很快就完成(这个DBA范畴的东西,我也不是太懂)。如果一个语句占用这个表3个小时了,那么别人session执行查询语句也很慢(或许别人的session运气好本来应该很快才对)。现在用timeout结束掉这个session,其他的session执行查询语句,可能就快了。




https://stackoverflow.com/questions/12660636/oraclecommand-timeout?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa  comand tiem out

https://forums.devart.com/viewtopic.php?t=25872
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值