运行环境: 1、weblogic + 项目(spring mvc) + oracle11g数据库 + jdk8.144 2、某个程序在运行一段时间后(针对部分数据保存出错,部分数据不出错),没有进指定方法,直接404出错。 3、重启后,同样的数据保存成功 4、每天下午2-4点左右出现这种情况,未能找到根本的原因(后台没有错误日志与提示) 5、目前调试环境运行无法重现错误。   
其它说明:    1、目前排除数据库原因(同时启动了一个应用程序的备机,连到该数据库,在主机出库时,备机正常操作)。    2、报错是针对该页面提交数据的所有用户,不是单个用户    3、java内存运行时正常占用30%左右。 
如果有人愿意帮助解决该问题,个人愿意支付技术服务费2000元整,非常感谢参与。 

解决方案 »

  1.   

    查看一下  指定方法   的@RequestMapping的value 有没有在其他方法上有相同值
      

  2.   


    1、不是连结池或是资源问题,因为同样的界面,填写一个别的数据,可以正常提交保存2、目前最新的进展,在报错的情况下,连preHandle方法都没进,直接就404。谢谢。
      

  3.   

    从你的问题描述看,问题应该出现在进入servlet之前,
    那就是filter,或者weblogic,或者代理服务器给挡住了?前两者的可能性比较大。如果是filter的话,把你用的filter贴出来。如果是weblogic的话,看看weblogic的日志或者linux的message贴出来
    调整Accept Backlog参数试一下
    参考这个文章
    https://blog.csdn.net/lykangjia/article/details/52839656
    或者参考上面的文章配置一下其他参数出现问题的时候F12把请求的报文和回来的报文贴出来另外,不一样的数据是什么?你发送数据有多大,有没有特殊字符,比如回车符什么的,正常的数据又是什么?服务器能按固定的步骤重现吗?比如每隔一天下午两点到四点,发送固定的数据会有问题,发送某些固定的数据又没问题。重启之后又好了,是重启weblogic上的application,还是重启weblogic,还是重启linux?
    备机是在同一网段的不同的linux上?
      

  4.   

    非常感谢你的意见1、只是重启weblogic
    2、同样的提交页面,点保存时(页面填写有一些数据可以通过保存,有一些不能)
    3、数据量不大,约20多项字段
    4、可以保证提交的内容绝无问题(因为同样的数据在重启后豪无问题)
      

  5.   

    有没有排出代理服务器和过滤器的问题?
    我觉得很有可能是weblogic的配置问题,应该是请求达到一定的程度导致的weblogic层的堆积导致weblogic拒绝了后续同样的请求?
    理由有些勉强,如果拒绝请求的话不应该是404错误。
    但可以把Accept Backlog调大一些试一下,或者在weblogic层用其他方式优化一下。如果排除了weblogic的问题的话,我很关心有一些数据可以通过保存,有一些不能的问题。
    就是在发生错误的时候能保存的数据和不能保存的数据有没有什么明显特征。
      

  6.   

    比如发生错误的时候只重起应用,不重起weblogic,看看能否解决问题?
    如果不能解决问题的话,几乎可以判定应用没问题。
      

  7.   

    如果出现错误的时候,系统没有变慢,只是特定数据有问题的话,或者一些特定的数据被代理或其他程序给屏蔽了?
    感觉你应该是高手了,我觉得应该先定位问题,用可能的手段层层定位,把问题定位到代理,防火墙,weblogic,filter,程序,连接池,数据库。
    定时任务,外部环境上,认为因素上。
      

  8.   

    建议全应用搜索 Random,Timer,Schedule,Fromat等字样, 看看是否有恶意的代码
    还有就是要确认服务器跑的应用只有这一个 否则就暂停其他应用?
    每天下午2-4点 那可以搞个小程序修改系统时间跳过这个时间段,如果还有问题那就是不是系统时间引起的
      

  9.   

    经常多点的修改,后台记日志等反复调整,最新进展如下:1、同样的订单程序(针对部分的订单数据保存报错404,少部分的不报错)2、保存时,进入了保存的save方法
      

  10.   

    能否把debug或trace日志打开(太多的话定时删日志),跑上一天。
    单纯的404,spring会报警报,我怀疑没有进入spring。
    weblogic的trace日志也打开,
    404的log和正常的log对比一下,看看停到哪了。
      

  11.   

    你配了负载均衡在weblogic?
    看一下这个问题是不是你的问题
    http://cybergav.in/2009/07/06/wls-http-404-errors-for-requests-to-bea_wls_internalwldummyinitjvmids/
      

  12.   


    我是单实例weblogic
      

  13.   


    给的信息太模糊了,简单的问题的话,你那边团队想必早就解决了,既然外挂我们能帮你解决的问题,又不能提供准确的信息。
    我想能帮你解决问题的人不大可能业务环境现象都不明确的情况下花宝贵时间陪你猜来猜去的。
    一般这种问题到最后都是很简单的原因,不可能不能定位。
    我觉得你的判断有问题,希望提供客观明确的信息。1、主要是不知道提供哪些信息算是有帮助,目前后台用小窗口的模式运行,从小窗口的滚屏上,可以看到输出了访问的路径,但没有出错信息,我弄几个图上来。2、weblogic的日志里面,确实没有一丁点有帮助意义的东西,也仔细看过了。
      

  14.   

    出错前,什么数据都能保存。1、系统运行大半天后,这种数据还可以保存12、系统运行大半天后,以下数据不能保存(部分差别,并不存在超长之类,只要重启weblogic,以下数据一定可以保存)
      

  15.   

    清一下weblogic的缓存试一下,或者看一看缓存中出错的文件有没有问题,编译时间对不对。类似于下面的目录Delete the Precompiled JSP folders and the contents of tmp folder:
     C: \Oracle\Middleware\user_projects\domains\EPMSystem\precompiled  C:\Oracle\Middleware\user_projects\domains\EPMSystem\precompiledJSPs  C:\Oracle\Middleware\user_projects\domains\EPMSystem\servers\FoundationServices0\tmp
      

  16.   

    这是小窗口的滚屏,在滚屏上,点保存的时候,可以看到打出了路径。以下是该 段程序的源代码(java-spring-mvc)
    weblogic的内存配置
      

  17.   


    每次发布的时候,都是重新打印,删除tmp,cache,logs等,因为这个是运行过程中出错,所以这个无能为力啊。再者,就算出错的时候,部分数据还是可以提交的,这个真不知道该如何解释了
      

  18.   

    看样子是停在doSaveCB中了
      

  19.   


    奇怪的吓人,就是停在doSaveCb中,好说后面的catch中的语句也要运行啊,是不是?
      

  20.   

    如果你的save方法抛的不是exception,那就catch不到了。比如error或自定义异常直接继承throwable,然后抛给框架,框架中对这两种异常跳转配置不对,就会404。
    把catch exception 改成 cache throwable 试一下,先用system.out打印异常信息,然后再用你的savelog打印,另外5秒空闲关闭连接是不是有点短?先看异常明天。
      

  21.   

    真的快被折魔得快疯了,什么都没动的情况下,晚上又可以正常保存了。从这种情况看来,是weblogic用户太多或是系统太忙造成的?
      

  22.   

    应该是系统忙得时候表现的问题,可能是连接数,超时,程序问题,内存溢出,数据库死锁等,先定位问题。
    在本地的开发环境上做如下修改:
    1.把weblogic的连接超时时间和生产环境做同样的配置,貌似是5秒。
    2.在mtsave的入口处(第一行)加入如下代码,跑一下,看看能否重现问题: try{
    System.out.println();
    System.out.println("start sleep.");
    Thread.sleep(1000*60*6); // sleep 6 minutes
    System.out.println("end sleep.");
    }catch(Throwable th){
    th.printStackTrace();
    }3.如果步骤2不能重现问题,在mtsave的入口处(第一行)加入如下代码,跑一下,看看能否重现问题: System.out.println("start testError.");
    throw new Error("test error.");4.审查impl.doSaveCB()这个方法从入口到存入DB返回到入口的这一串操作,有没有业务或逻辑问题。
    能做的就这么多了。
      

  23.   

    1、对了,5秒哪个配置,昨天找了好久,没有找到修改地方(ver:12.2.1.3.0)2、中午安排一个测试(在mtsave的入口处(第一行)加入如下代码,跑一下,看看能否重现问题:)3、第三部分说明的代码我今天就测试4、impl.doSaveCB()确认过很多次了,99%应该没问题,有近10年的历史,并有超过50个客户在使用。
      

  24.   


    奇怪的吓人,就是停在doSaveCb中,好说后面的catch中的语句也要运行啊,是不是?这时候数据库日志有异常吗
      

  25.   

    5秒的问题参考一下
    https://community.oracle.com/thread/695621
    貌似是这个配置
    Managed Server > Protocols > HTTP > Duration如果weblogic那边5秒就切断的话,应用那边遇到响应时间超过5秒的有可能继续跑,有可能抛出异常,但是浏览器那边catch不到。生产环境上昨晚该得代码try catch error throwable的那个别动,放在生产环境上,出问题的时候检查log。hibernate等jar包版本有没有升级过。
      

  26.   


    System.out.println("start testError.");
    throw new Error("test error.");抛Throwable, Exception,RuntimeException的也都分别测一下,抛给框架,看看weblogic和框架有啥反映。
    (RuntimeException和Error以外可以把mtsave方法加上声明抛出)
      

  27.   

    曾经发生过hibernate等xml配置中的头写的dtd,xsd等路径是http开头的,生产环境往外的80端口被封掉,导致的404错误。
    把这些文件下到本地就解决了。
    你的时个别偶尔出错,应该不是这个问题,参考一下。
      

  28.   


    所有的JAR包应该有近一年没有变动过
      

  29.   


    代码中这样写了,中午更新一个版本上去,看看下午再出什么错。
    1.生产环境不要加throw new Error("test error.");
    2.测试环境把我说的那些代码分别加到程序的入口,你现在加的位置没什么用。
       加到mtsave刚进来的地方,然后后面的程序都注释掉,不跑业务,直接抛给框架异常,不要trycatch,只想在测试环境看看框架和weblogic接到这几种异常分别会做出什么响应。
      

  30.   

    case1:测试程序超时。原来的注解都加上
    public ModelAndView mtsave(HttpServletRequest req
    ,HttpServletResponse res
    ,ModelMap model){
    try{
    System.out.println();
    System.out.println("start sleep.");
    Thread.sleep(1000*60*6); // sleep 6 minutes 或者更大
    System.out.println("end sleep.");
    }catch(Throwable th){
    th.printStackTrace();
    }
    }
    case2:测试Error异常。原来的注解都加上
    public ModelAndView mtsave(HttpServletRequest req
    ,HttpServletResponse res
    ,ModelMap model){
    System.out.println("start testError.");
    throw new Error("test error.");
    }
    case3:测试Throwable异常。原来的注解都加上
    public ModelAndView mtsave(HttpServletRequest req
    ,HttpServletResponse res
    ,ModelMap model) throws Throwable {
    System.out.println("start testError.");
    throw new Throwable("test error.");
    }
    case4:测试Exeption异常。原来的注解都加上
    public ModelAndView mtsave(HttpServletRequest req
    ,HttpServletResponse res
    ,ModelMap model) throws Exception {
    System.out.println("start testError.");
    throw new Exception("test error.");
    }
    case5:测试RuntimeException异常。原来的注解都加上
    public ModelAndView mtsave(HttpServletRequest req
    ,HttpServletResponse res
    ,ModelMap model){
    System.out.println("start testError.");
    throw new RuntimeException("test error.");
    }
      

  31.   

    生产环境不要加throw new Error("test error.");,否则会影响正常业务。
      

  32.   


    请问是这样写嘛,没写过
    建议您直接加一个aop 异常捕获,从您的反馈来看,一部分代码可以执行另外一部分代码没有执行这种异常代码内必然可以捕获的。
    在aop层直接加一个 catch Throwable,并且log.error(e)把所有的日志都记录下来另外便于调试,建议您把weblogic的运行日志也打开到debug级别,在weblogic运行日志中,dispatcher的信息都是有的
      

  33.   


    请问是这样写嘛,没写过
    建议您直接加一个aop 异常捕获,从您的反馈来看,一部分代码可以执行另外一部分代码没有执行这种异常代码内必然可以捕获的。
    在aop层直接加一个 catch Throwable,并且log.error(e)把所有的日志都记录下来另外便于调试,建议您把weblogic的运行日志也打开到debug级别,在weblogic运行日志中,dispatcher的信息都是有的谢谢1、先把weblogic的debug开起来吧2、今天中午重新发布应用后,没有出错,继续看明天的情况。
      

  34.   

    mtsave f...ex
    mtsave f...er
    mtsave f...th
    今天上面这些信息有没有输出?