一个不知道哪错的错!

前言java

本人小菜一枚,这个错误最终虽然是找到并解决了,可是如今仍然没有彻底明白是为何?问了问其余的同事也没具体定位到问题的本质,不过我仍然认为有记录的必要性。技术上没找到这个问题的根源,项目开发上是知道为何会产生这个问题的!先不说太多,先把这个犯错和解决错误的具体状况记录下来,也好为之后避免这样的错误而积累点小小的经验!
linux

事源web

此列表是咱们的应用所对应的环境,具体以下所示:spring

软件环境 开发环境 测试环境 生产环境
操做系统 windows2003
Web服务器

tomcat6数据库

tomcat6windows

weblogic
数据库 oracle 10g oracle 10g oracle 10g

 

事情是这样的,前一段日子咱们作的一个项目,已经上线用户也一直在用,不过在使用的过程当中出现一个比较奇怪的问题(出问题的地方是一个和文件的上传下载功能相关的模块)该功能模块老是时不时的出现一些问题,可是在开发环境和测试环境上倒是好好的,生产环境用户一直在用着不能白天停下来查错,可是必须尽快的将问题解决不然只要用户一使用对应的功能就会产生错误---要上传的文件上传失败。tomcat

我首先想到的缘由多是发布的问题,咱们专门发布的同事采用的是增量式的发布,有些文件生产环境和开发环境可能没有彻底同步,因而当天晚上咱们从新发布了一版新的应用,而且用Admin用户登陆测试了一下对应的功能,没问题了,很高兴就回去了!若是问题就这么容易解决了,个人印象可能就不会这么深入也没有记录的必要性了!次日用户反馈说仍然有问题(我在客户现场上班)不对还要继续的查找,因而当天晚上我和那位发布应用的同事,开始逐步的查找到底那里出问题了!服务器

程序出问题是很正常的,也是不可避免的!关键是想不通为何在开发环境下没问题,在测试环境也没问题,在生产环境上也不是老是有问题,时而正常时而又不正常!我常说“找到问题产生的缘由等于解决了一半的问题”,在项目开发中或者其余的状况下最怕这种不报错、不抛错、在开发环境正常在生产环境下时而正常时而又有问题的错误了,无从下手,固然主要仍是本身比较菜的缘故!mybatis

如今就大络的认为是有因为系统环境的问题形成了此错误,不过排查仍是要的,不能容忍这样的错误存在!咱们仔细的查看了weblogic服务器运行的日志文件,以期可以找到引发问题的缘由!功夫不负有心人,找到了---在日志中有一句插入语句没有执行(咱们的文件上传是一种多对多的关系,须要往多个表中插入记录)。因而在本身的电脑上找到对应的程序段,来回检查了一下,没有发现有什么错误,让同事也看了一下,也没看出有什么错,不过在个人Action类中的具体的方法中即用try...catch捕获错误又用throws将错误往上抛出交给上一层的程序来处理,同事认为有问题因而去掉throws部分---从新编译此文件---从开发的服务器上找到编译好的文件---拿到生产环境发布---重启应用---测试---仍是有问题---查看日志文件---和上次的状况同样依旧不报错!因而重复上述的操做,只是此次在对应的代码段中加上了若干条的输出语句,看看到底走到里不走了,使用这种方式再细化一下,最后终于找到走到那一句不走出问题了,不过下面就很是奇怪了由于怎么查也查不出不走的那个一句那里出问题了(是一段公共的且很是简单的程序)而后用一样的方式继续往那一句的方法中跟进,仍然没理出头绪来,看看时间十一点已过没办法,明天还得继续上班明天继续吧!oracle

次日一上班用户就问问题解决没。。。。。。

因而乎,当天晚上咱们计划继续搞并且下定决心,找不到问题解决不了问题就不走了!工做的热情值得嘉奖,不过若是方向错了越努力错的就会越远!下午下班时,咱们提早买上了点吃的,基本上按照昨晚的方式更加细化的又走了几边,在十二点的时候头都昏了!想走又不甘心,当天晚上的风比昨天的更大,只听见忽忽的拍打着玻璃的巨响,貌似在嘲笑咱们“瞧瞧,这两个笨蛋这两天都是干了些什么?一个很是简单的错误到如今还没解决!”我可怜的同事,就这样陪着也遭了罪,咱们都有些想回去了,不过若是今晚解决不了明晚又得继续(离周末还有两天呢!),再查查看若是仍是没找到问题的所在就回!不过,我左想右想就是想不通,为何不报错?为何不抛错哪?程序在开发、测试、生产是如出一辙的就环境不一样,可是开发和测试都正常,生产上又不能调试,好犯难!

起来看看同事玩的啥游戏,走走动动,从头至尾再看一遍,就当我从新开发那!此次当看到对应的模型类时忽然间灵光一闪,我终于知道,我错在哪里了?

错误

咱们的项目文件结构大概以下所示,下面只是一个功能模块的事例

src.com.ca.agent

                        action//Action类文件包

                        dao//Dao文件类包,dao包下直接放的是咱们手工写的

                                 mapper//mppper包下的由mybatis自动生成器自动生成的,对应单表的增删改查都有

                        model //Model文件类包,model包下直接放的是咱们手工写的,为了扩展开中发须要的模型类

                                 mybatis//mybatis包下面的由mybatis自动生成器自动生成的,根据数据库中的表自动生成

                        service//Service文件类包,service包下直接放的是服务的接口类

                                  impl//impl包下直接放的是服务的实现类

最终发现关于文件上传下载的那个关系表的模型有两个,model包下面有一个,mybatis包下面也有一个在上面的java类包中用到的全是com.ca.agent.model包下面的,不过在mybatis生成器自动生成的和数据库交互的映射文件中以及对应的Dao接口类中倒是用的

com.ca.agent.model.mybatis包下面的!固然他两的属性和方法彻底同样,只是在不一样的包下面而已!问题应该就在这里了,找到问题下面的事情就比较简单了,将他们变成统一的应该就能把这个问题完全的解决了!我选择将com.ca.agent.model包下面的模型类删掉,程序中用到的所有换成com.ca.agent.model.mybatis包下面的!

从新发布后问题果真完全消失了!这两天印象颇深,如今还记得很清楚,问题总算搞定,固然更深层的问题还没解决?

始终没弄明白,为何在生产环境下时好时坏?而在开发、测试上则一直没问题?还有就是为何不报错?

下面是部分事例代码(引发问题的部分代码,仅示意一下),以作提醒避免下次犯一样的错误!

1:上面的java类包中除了mybatis生成器自动生成的部分,用到的FileAgent类所有引自com.ca.agent.model

package com.ca.agent.dao;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import com.ca.agent.model.FileAgent;

/**
 * @说明:代理人文件管理
 * @author godtrue
 * @修改时间:2014-01-09
 */
public class FileAgentDao extends SqlSessionDaoSupport{
    /*
     * 增长
     */
    public void insert(FileAgent fileAgent){
        this.getSqlSession().insert("com.ca.agent.dao.mapper.FileAgentMapper.insert", fileAgent);
    }

 2:下面是一个mybatis生成器自动生成的一个Dao接口类的部分代码,类中的FileAgent类引自com.ca.agent.model.mybatis

package com.ca.agent.dao.mapper;

import com.ca.agent.model.mybatis.FileAgent;
public interface FileAgentMapper {
/** * This method was generated by MyBatis Generator. * This method corresponds to the database table SALES.FILE_AGENT * * @mbggenerated Thu Jan 09 18:38:38 CST 2014 */ @Insert({ "insert into FILE_AGENT (AGENT_CODE_ID, FILE_ID, ", "FILE_TYPE_ID, IATA_CODE, ", "OPERATOR, OPERAT_IDENTIFY, ", "LAST_UPDATE_DATE)", "values (#{agentCodeId,jdbcType=DECIMAL}, #{fileId,jdbcType=DECIMAL}, ", "#{fileTypeId,jdbcType=DECIMAL}, #{iataCode,jdbcType=VARCHAR}, ", "#{operator,jdbcType=VARCHAR}, #{operatIdentify,jdbcType=DECIMAL}, ", "#{lastUpdateDate,jdbcType=TIMESTAMP})" }) int insert(FileAgent record);

后话

这个错误,如今我只能说和程序运行的环境有关,可是再具体是为何就不清楚了,有待进一步的查证!不过为何会出现上面的状况哪?为何会出如今一个项目开发中同一张表对应的模型会有两个如出一辙的状况哪?这就要说说这个项目管理方面的状况了,刚开始时咱们这个项目有两组人共同开发,而且思路都是不同的好比:有一组开发人员历来不用mybatis自动成的Dao接口文件和对应的数据库与模型的映射文件,他们认为里面的好多代码都没有用很是的多余,而另外的一组人员则是习惯使用这些自动生成的文件!并且命名的习惯也不相同,为此还专门的开过一次小会制订了一个项目命名规范的文件!不过有些习惯上的地方仍然没有彻底的统一,就形成相似这样的问题的发生!再者就是项目组的成员不是很稳定,最多时开发人员有二十几个,中途有离职的有调到其余项目的!这样代码的质量很难有很是好的保证,项目管理很是重要,这一块我尚未具体的涉及,只是看过几本书,不过从实际的经验来看仍是能实际的体会到一些东西在的,好比:

1:项目组的人员最好不是拼凑而成的,多少有些默契合做起来才能更加的顺畅

2:有些东西最好统一,最好在动手开始作项目的时候就跟你们讲清楚,尽可能选择一种更优的方式,好比:编码的风格、命名规范、项目的基本业务知识等等

3:就公司而言,我想在项目的开发期间保持项目组的人员尽可能少的变更可能会节约更多的开发成本,除非加入一些很是牛的新成员

固然,对于查错也有一条比较灵验的经验值得分享:当感受有问题愣是查不出来的时候,不妨从头再来,对于你认为不可能出错的地方也去仔仔细细的查查,说不定会有所获!

相关文章
相关标签/搜索