package util;import java.sql.*;
import java.util.Calendar;  
import java.util.TimerTask;  
import db.dbConn;  
import db.dbConn2;import javax.servlet.ServletContext;  
  
/** 
 * 继承 定时器任务类 
 *  
 */  
public class UpdateMKTStore extends TimerTask {  
  
    public UpdateMKTStore() {  
        super();  
    }  
  
    /** 这个代表7点之后执行任务 */  
    private static final int C_SCHEDULE_HOUR = 7;  
  
    private static boolean isRunning = false;  
  
    private ServletContext context = null;  
  
    public UpdateMKTStore(ServletContext context) {  
        this.context = context;  
    }  
  
    public void run() {  
        Calendar cal = Calendar.getInstance();  
        if (!isRunning) {  
            if (C_SCHEDULE_HOUR < cal.get(Calendar.HOUR_OF_DAY)) {  
                isRunning = true;  
                context.log("开始执行同步超市线下库存列表任务");  
                  
                dbConn dbo=new dbConn(); //建立BBC库的数据库连接
                dbConn2 dbo2=new dbConn2();//建立middle库的数据库连接
                java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
            java.util.Date currentTime = new java.util.Date();    
            String time = simpleDateFormat.format(currentTime); 
            System.out.println(time);            
             int changeNum=0;
             int notChangeNum=0;
                try {
                //查询全部的待同步商品id
                String sql="select distinct item_id from sysmkt_store where flag =0  ";
                ResultSet rs = dbo2.executeQuery(sql);
                rs.last(); //移到最后一行
         int rowCount = rs.getRow();//得到当前行号
         rs.beforeFirst();
         //System.out.println(rowCount);
                for(int i = 1;i<rowCount+1;i++){//循环全部待同步的item_id
                 System.out.println(i);
                if(rs.next()){
                int m_item_id= rs.getInt(1);
                String sql1="select item_id,item_store,sku_id,sku_store from sysmkt_store where item_id="+m_item_id+" ";
                ResultSet rs1 = dbo2.executeQuery(sql1);
                rs1.last(); //移到最后一行
         int rowCount1 = rs1.getRow();//得到当前行号
         rs1.beforeFirst();
         int flag = 0;//初始化标识符0:可同步;1不可同步
                for(int j = 1;j<rowCount1+1;j++){//循环该item_id下的全部sku_id
                 if(rs1.next()){
    int m_sku_id= rs1.getInt(3);
    int m_sku_store= rs1.getInt(4);
                    String sql2="select freez from sysitem_sku_store where sku_id="+m_sku_id+" ";
                    ResultSet rs2 = dbo.executeQuery(sql2);
                    while(rs2.next()){
                     int b_freez= rs2.getInt(1);
                     if(b_freez > m_sku_store){
                     //比较冻结库存与待修改库存大小
                     flag = 1;
                     }
                    }
                    rs2.close();
                    //dbo.closeConection();
                 }
                }
                if (flag==0){
                 rs1.beforeFirst();
                 for(int j = 1;j<rowCount1+1;j++){
                  if(rs1.next())
 {
                 changeNum++;
                     int c_item_id= rs1.getInt(1);
                        int c_item_store= rs1.getInt(2);
                     int c_sku_id= rs1.getInt(3);
                        int c_sku_store= rs1.getInt(4);
                        String sql3 = "update sysitem_item_store set store="+c_item_store+" where item_id="+c_item_id+"";
                    int rs3=dbo.executeUpdate(sql3);
                 String sql4 = "update sysitem_sku_store set store= "+c_sku_store+" where sku_id= "+c_sku_id+"";
                    int rs4=dbo.executeUpdate(sql4);
                 String sql5 = "update sysmkt_store set flag=1,modified_time='"+time+"',reason=''  where sku_id="+c_sku_id+"";
                    int rs5=dbo2.executeUpdate(sql5);
                  }
                 }
                }
                if (flag==1){
                 rs1.beforeFirst();
                 for(int j = 1;j<rowCount1+1;j++){
                  if(rs1.next())
 {
                 notChangeNum++;
                 int n_sku_id= rs1.getInt(3);
                 String sql6 = "update sysmkt_store set flag=2,modified_time='"+time+"',reason='商品库存小于当前冻结库存'  where sku_id="+n_sku_id+"";
                        int rs6=dbo2.executeUpdate(sql6);
                    
                  }
                 }
                }
                rs1.close();
                }
                }
                if (changeNum==0){
                 System.out.println(time+":当期无库存修改");
                }
                else{
                 System.out.println(time+":当期修改:"+changeNum+"条库存记录,未修改库存记录:"+notChangeNum+"共计"+rowCount+"条记录");
                }
                rs.close();
                
            } catch (SQLException e) {
             System.err.println(e.getMessage());
}
                finally{
                 dbo.closeConection();
                dbo2.closeConection();
                }
                isRunning = false;  
                context.log("指定任务执行结束"); 
                
                
            }  
        } else {  
            context.log("上一次任务执行还未结束");  
        }  
    }
}  这个大致是从middle库读取全部的商品列表,然后去BBC库比对商品的冻结库存,大于冻结库存才可以修改库存。
这个逻辑大体上是没什么问题,就是不知道为啥,debug 的时候经常出现[toString() unavailable - no suspended threads]这个错误,跪求大神给予解答啊

解决方案 »

  1.   


    没有报错,就是执行的效率很低,经常会卡住,然后我就去debug调试看看,一直按着F6单步调试的时候,就出现了[toString() unavailable - no suspended threads]
    数据量大概是个1W+的样子。
    不知道您说的打印有问题指的什么问题呢
      

  2.   


    不好意思刚才没看清,既然程序不报错只是执行慢,那说明你该优化代码逻辑。 至于你DEBUG的时候出错,这个有时候是正常的