开发一个项目,上月的产品“结余”值,等于这个月的“上月结存”,所以我用定时任务quartz在1号的凌晨2点15分执行任务.
思路是先循环所以车间,然后再根据车间和上月的月份遍历所有产品,然后根据每个对象的ID号,车间名、判断本月有无此对象,没有进进行创建对象,但是出现一个现象,就是有的个别记录出现重复记录现象,而且还是间歇性的,并不是所有时候都这样,比如
上月: 
    id  月份  名称  结余  上月结存
     1    2     齿轮  200    
     2   3      齿轮   200     200   
     3    3     齿轮    200    200这样就出现重复的2条记录。请大家帮忙啊,
/**
 * 自动合计这个月的上月结存
 */
public void addLastMonthBalance() {

Calendar rightNow = Calendar.getInstance();
int thisYear = rightNow.get(Calendar.YEAR);
int thisMonth = rightNow.get(Calendar.MONTH) + 1;
int lastYear = thisYear;
int lastMonth = thisMonth -1;
if(lastMonth == 0){
lastYear = thisYear - 1;
lastMonth = 12;
}


List secList = this.searchSector();//循环所有的车间
String hql = "select s from Stats s where s.sector.id = ?  and s.yearNum = ? and s.monthNum = ? and s.balance != 0";

for(Iterator iter = secList.iterator(); iter.hasNext();){
Sector sector = (Sector)iter.next();

//遍历上月的本车间的所有产品
    List list = this.getSession().createQuery(hql).setParameter(0, sector.getId())
.setParameter(1, lastYear)
        .setParameter(2, lastMonth)
.list();

if(list.size() > 0){ String sHql = "select s from Stats s "
+ "where s.parts.id = ? and s.sector.id = ? and s.yearNum = ? and s.monthNum = ?";
                
for (Iterator ite = list.iterator(); ite.hasNext();) {
Stats stats = (Stats)ite.next();//循环所有产品对象
                                      //判断本月是否存在这个对象
 Stats sta = (Stats) this.getSession().createQuery(sHql)
 .setParameter(0,stats.getParts().getId())
  .setParameter(1, stats.getSector().getId())
 .setParameter(2, thisYear)
  .setParameter(3,thisMonth)
.uniqueResult(); if(sta == null) {//如果本月不存在就创建对象,赋值
Stats newStats = new Stats();
newStats.setSector(stats.getSector());
newStats.setParts(stats.getParts());
newStats.setUpBalance(stats.getBalance());
newStats.setYearNum(thisYear);
newStats.setMonthNum(thisMonth);
newStats.setBalance(newStats.getBalanceValue());
this.getHibernateTemplate().saveOrUpdate(newStats);
this.getHibernateTemplate().flush();
this.getHibernateTemplate().clear();
}else{

sta.setUpBalance(stats.getBalance());
sta.setBalance(sta.getBalanceValue());
this.getHibernateTemplate().update(sta);
}

}
}


}
}

解决方案 »

  1.   

    呵呵,内容不是自己写的缘故可能,所以看起来比较复杂,不过我想应该是sql语句写得有问题,或者是你的条件语句写得有一定的问题吧,仔细的检查一下,肯定能够解决的,
      

  2.   

    内容当然是我自己写的了,SQL语句也没有毛病,但是很难判断是什么问题,我估计是2000server服务器的问题。
      

  3.   

    有关这种问题是不是应该考虑用同步控制呢?
    比如   
      synchronized{.....}   
      在进入这段代码的时候,   加锁,   离开的时候,   解锁
      

  4.   

    hibernate中有一个防止重复插入的属性,你可以使用hibernate试下!
      

  5.   

    今天,继续进行测试,不知道怎么,问题大了,自动生成数据的时候,现在每一条数据都给你生成一条重复记录。1500百条数据让这么一搞,变成了3000条,弄了好久,发现是服务器tomcat的问题,后来我在别的计算机上拷贝server.xml文件,发现正常了,运行了20次,没有出现记录重复的现象,但是不敢确定,还能不能出现记录重复的问题。
      

  6.   

    既然如此,换成Jboos部署一下,试试看,确定下原因;
    呵呵,quartz是线程池的,所以不用再他身上动脑筋的,他应该不会出现重复问题;
      

  7.   

    用到监听器了吧 并且在server.xml中配置了你的项目,是不是?
      

  8.   

    检查一下你的网页部分,可能在form表单提交的时候,js 事件和表单的提交事件重复了  造成了提交两次。