小问题,大智慧

来源:互联网 发布:程序源码 编辑:程序博客网 时间:2024/04/29 20:32

           遇到一个很奇怪的问题:现在的程序开发基本上都是基于3层的开发模式:展现层,业务逻辑层,数据库层。也就是经常说的CSS或者是BSS,我认为统称为3层结构,因为本质上并没有太大的区别。展现层的方式各种各样,这不是我此次遇到的问题。

         我这次遇到的问题是:一个交互涉及的表很多,而且数据量也大,不能全部拿到中间层(java实现)来做,因为这要耗费很大的时间提取然后处理。鉴于这个交互的共用度较低,我就在后台用oracle的存储过程来实现了。但是在测试发现一个很怪异的问题:当一个一个单位的调用该过程时,程序能够很好的响应,并且返回前台操作成功的提示。但是当我用经办机构来做的时候(一个经办机构包含很多单位,实际上市循环单位来调用该过程),问题来了:程序不能正确的完成我的需求,总是报数据库操作失败。实际上我调试了中间的java层,请求已经接受,并且把执行存储过程的命令已经发给了oracle服务器,之后中间的java层只能等待oracle给的返回结果,但是这个返回值等的中间层很是不耐烦,因为数据量大,你得让oracle做完该做的事情后才能告诉java层我做完了,而且做得到底怎么样成功也好失败也好,好让人家java向前台回报,但是1秒过去了,2秒过去了,10秒过去了,60秒过去了,oracle好像是睡着了,迟迟不给java层回应(实际上oracle很忙,他在不停地忙着做啊,做啊……),但是java层着急了,java层说我不等了,于是把开启的事务给回滚了,报告前台:oracle执行失败了。实际上失败了吗?没有。但是事务已经回滚了,我得不到想要的结果。

         我在后台单独执行这个存储过程,确实是一点问题没有,执行的时间是88秒,对于我而言,这么大的数据量在一分钟内完成甚至是稍多点都是很正常的,但是java层等不及了,于是发脾气,给前台报oracle数据库失败。怎么说呢?不能全怪java,这是请求与响应之间的等待时间问题,在装了IE5或更高版本后会存在这个问题,默认的请求与响应延时为60秒,即发出请求后一分钟不给我回应,我就不等了,就要重新发请求。现在知道原因了,说起来挺简单,但是最开始我不知道 是什么原因造成的,因为我跟到java层把执行储存过程的命令发给oracle服务器后,剩下的工作就是oracle的事情了,于是我test存储过程,在经过了85秒之后,过程成功结束,而且也得到了我想要的结果,但是从前台这样一路走来就不行呢?我猜想可能是oracle给 java层的响应时间超出了java的等待时限。起初我不知道还有参数控制java层的等待时间,我能做的就是优化后台存储过程,让它快点跑,早点给java层响应,这样不就好了,但是谁都知道优化工作,那不是弄一点就能立马见效的,更何况,写的时候就已经注意了优化,所以再优化的空间就更小了,所以想尽了办法来优化,最后能够82秒执行完。3秒的时间我整整耗费了一个上午的时间啊!既然这么背,吃饭的时候就发发牢骚吧。但是我不经意的一说,刚好赶上一个同事也遇到此类问题,他说在注册表新增一个值,重启就好。我的妈啊!那种感觉真的是如释重负啊!

下面把这个参数介绍一下:
       名称 :   ReceiveTimeout
       所属路径:HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows/CurrentVersion/Internet Settings
       键值类型:DWORD
       值大小设定:值=(秒)* 1000 ;即如果想设置为3分钟:180*1000=180000毫秒。
       注意事项: 设定值时选择10进制。
       引用:
       Add a ReceiveTimeout DWORD entry with a value of ()*1000 in the following registry subkey:
       HKEY_CURRENT_USER/SOFTWARE/Microsoft/Windows/CurrentVersion/Internet Settings
       For example, if you want the time-out duration to be 8 minutes, set the value of the ReceiveTimeout entry to 480000 (<480>*1000).
       Restart the computer.

该参数的作用:

     The time, in seconds, that a Vuser will wait to receive the response of a specific HTTP request   within a step before aborting.

感触:

    你的问题在别人可能不是问题,或者是别人也曾经遇到过但是已经解决!

原创粉丝点击