将诉讼案卷表字段 正副卷数字段两个均为空 多线程进行更新--出现线程安全问题

package com.xiangshuai.task;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.xiangshuai.pojo.Ssaj;
import com.xiangshuai.thread.DxThread;
import com.xiangshuai.util.PageUtil;


/**
 * @author lqx
 * 将诉讼案卷表字段 正副卷数字段两个均为空 多线程进行更新--出现线程安全问题
 * 文件在E:\学习文档子目录压缩\并发技术\J2SE多线程基础 或我的网盘\我的笔记\学习文档子目录压缩\并发技术\J2SE多线程基础下
 */
public class TaskUpdateZFJ {
    public static void main(String[] args) {
        try {
            new TaskUpdateZFJ().runTask();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    //定时任务执行
    public void runTask() throws Exception{
         System.out.println("开始进行");
         Connection conn = getConnection();
         Statement cs = null;
         ResultSet rs =null;
         //PreparedStatement ps=null;
         //String ajsql="select SYS_ARCHIVENO AH,ID ID from t_ar_ssaj  WHERE (AR_ZJS IS NULL OR AR_FJS IS NULL) and SYS_DELETEFLAG='0' AND AR_SZHPCH IS NOT NULL AND ID='FOC71FE182631F44EBB16296BC2991958C'";
         String ajsql="select SYS_ARCHIVENO AH,ID ID from t_ar_ssaj  WHERE (AR_ZJS IS NULL OR AR_FJS IS NULL) and SYS_DELETEFLAG='0' AND AR_SZHPCH IS NOT NULL ";
         try {
             cs = conn.createStatement();
            List<Ssaj> list=new ArrayList<Ssaj>();
            rs =cs.executeQuery(ajsql);
            while(rs.next()){
                String ah=rs.getString("AH")==null?null:rs.getString("AH");
                String ajid=rs.getString("ID")==null?null:rs.getString("ID");
                list.add(new Ssaj(ajid, ah));
            }
            // 将原来的list以每个50000重新分割
            List<List<Ssaj>> threadListAj = PageUtil.splictList(list, 20000);
            
            //List<DxThread<Ssaj>> threads=new ArrayList<DxThread<Ssaj>>();
            List<Thread> threads=new ArrayList<Thread>();
            //更新
            for (int i=0;i<threadListAj.size();i++) {
                DxThread<Ssaj> thread = new DxThread<Ssaj>(threadListAj.get(i), cs,list.size());
                Thread t=new Thread(thread, "thread"+i);
                threads.add(t);
            }
            
            for (Thread dxThread : threads) {
                dxThread.start();
                System.out.print("---------------------------------------");
            }
            /*
            //更新
            for (List<Ssaj> ajlist : threadListAj) {
                
                
                for(int i=0;i<ajlist.size();){
                    
                }
                
                
                
                //lqx  -- 数字化挂接时更新 ssaj表正卷数和副卷数字段
                int zjs=0;
                int fjs=0;
                //lqx
                
                String id = aj.getAjid();
                String jnsql="select ar_type  from t_ar_ssjn where sys_parentid='"+id+"'"+ " order by sys_arsqe ";
                ResultSet jnrs = cs.executeQuery(jnsql);
                while(jnrs.next()){
                    String type=jnrs.getString("ar_type")==null?null:jnrs.getString("ar_type");
                     if("正卷".equals(type)||"副卷".equals(type)){
                        
                        //lqx
                        if("正卷".equals(type)){
                            zjs++;
                        }
                        
                        if("副卷".equals(type)){
                            fjs++;
                        }
                     }    
                }
                
                if(zjs>0 || fjs>0){
                    String updatesql="update t_ar_ssaj set ";
                       
                       //lqx
                       
                       if(zjs>0){
                            updatesql+="AR_ZJS="+zjs+",";
                        }else{
                            updatesql+="AR_ZJS=null,";
                        }
                       
                       if(fjs>0){
                           updatesql+="AR_FJS="+fjs+",";
                       }else{
                           updatesql+="AR_FJS=null,";
                       }
                       //去最后一个逗号
                       updatesql=updatesql.substring(0, updatesql.length()-1);
                       
                       updatesql+= " where id='"+id+"'";
                       cs.execute(updatesql);
                       
                       //lqx
                }
                
               
            }
            
            */
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            /*if(rs!=null){
                rs.close();
            }
            if(cs!=null){
               cs.close();    
            }
            if(cs!=null){
                cs.close();    
            }*/
            
        }
    }
    
    
    public  Connection getConnection(){

        
        String url ="jdbc:mysql://localhost:3306/test";
        String user ="root";
        String password ="MIMANG";
        String driver ="com.mysql.jdbc.Driver";
        
        Connection conn=null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url, user, password);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        return conn;
        
    }
}
 

DxThread.java

package com.xiangshuai.thread;

import java.sql.ResultSet;
import java.sql.Statement;
import java.util.List;

import com.xiangshuai.pojo.Ssaj;


public  class DxThread<T> implements Runnable {
    private List<T> list;
    Statement cs;
    
    public static volatile int dqTs=0;
    public static  int  zts=0;
    
    public DxThread(List<T> list,Statement cs,int zs) {
        super();
        this.list = list;
        this.cs=cs;
        zts=zs;
    }

    private DxThread() {
        super();
    }


    @Override
    public void run() {
        
        try {
             //模拟完成更新正卷数,副卷数操作
            for (T t : list) {
                Ssaj aj=(Ssaj) t;
                
                //lqx  -- 数字化挂接时更新 ssaj表正卷数和副卷数字段
                int zjs=0;
                int fjs=0;
                //lqx
                
                String id = aj.getAjid();
                String jnsql="select ar_type  from t_ar_ssjn where sys_parentid='"+id+"'"+ " order by sys_arsqe ";
                synchronized(cs){//因为多个线程用的是同一个cs 对象,所以存在线程安全问题,不加锁会出现ResultSet关闭之类的
                    ResultSet jnrs = cs.executeQuery(jnsql);
                    while(jnrs.next()){
                        String type=jnrs.getString("ar_type")==null?null:jnrs.getString("ar_type");
                         if("正卷".equals(type)||"副卷".equals(type)){
                            
                            //lqx
                            if("正卷".equals(type)){
                                zjs++;
                            }
                            
                            if("副卷".equals(type)){
                                fjs++;
                            }
                         }    
                    }
                    
                    if(jnrs!=null){
                      jnrs.close();    
                    }
                    
                    if(zjs>0 || fjs>0){
                        String updatesql="update t_ar_ssaj set ";
                           
                           //lqx
                           
                           if(zjs>0){
                                updatesql+="AR_ZJS="+zjs+",";
                            }else{
                                updatesql+="AR_ZJS=null,";
                            }
                           
                           if(fjs>0){
                               updatesql+="AR_FJS="+fjs+",";
                           }else{
                               updatesql+="AR_FJS=null,";
                           }
                           //去最后一个逗号
                           updatesql=updatesql.substring(0, updatesql.length()-1);
                           
                           updatesql+= " where id='"+id+"'";
                           cs.execute(updatesql);
                           dqTs++;
                            System.out.println(Thread.currentThread().getName()+" 当前更新案件数为"+dqTs+"更新总案件数为"+zts+" 更新SQL为 "+"--->"+updatesql);
                           //lqx
                    }
                }
                
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
         
    }

}
 

PageUtil.java

package com.xiangshuai.util;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lqx
 *分页工具类
 */
public class PageUtil {
    
    /**
     * @methoDesc:功能描述:将原list数据 切分成 (list.size/pageSize)--整除或(list.size/pageSize)+1非整除 
     * 个 list集合进行返回
     * @param list :原list数据 
     * @param pageSize :切分成的list集合数量,最后一个list集合数量可能会小于这个数
     * @return 切分好的list
     */
    static public <T> List<List<T>> splictList(List<T> list,int pageSize){
        int size = list.size();
        //总页数
        int totalPage=0;
        int temp = size%pageSize;
        if(temp==0){
            totalPage=size/pageSize;
        }else{
            totalPage=size/pageSize+1;
        }
        int endNo=pageSize;
        int startNo=0;
        
        List<List<T>> nlist = new ArrayList<List<T>>();
        for(int i=0;i<totalPage;i++){
            List<T> tempList = new ArrayList<T>();
            for(int j=startNo;j<endNo;j++){
                tempList.add(list.get(j));
            }
            startNo+=pageSize;
            if(totalPage-2==i){//最后一页的前一页,下一次的结束也为list.size
                endNo=list.size();
            }else{
                endNo+=pageSize;
            }
            
            nlist.add(tempList);
        }
        return nlist;
        
    }

}
 

Ssaj.java

package com.xiangshuai.pojo;

public class Ssaj {
    private String ajid;
    private String ah;
    public String getAjid() {
        return ajid;
    }
    public void setAjid(String ajid) {
        this.ajid = ajid;
    }
    public String getAh() {
        return ah;
    }
    public void setAh(String ah) {
        this.ah = ah;
    }
    public Ssaj(String ajid, String ah) {
        super();
        this.ajid = ajid;
        this.ah = ah;
    }
    public Ssaj() {
        super();
        // TODO Auto-generated constructor stub
    }
    @Override
    public String toString() {
        return "Ssaj [ajid=" + ajid + ", ah=" + ah + "]";
    }
    
    
    
    

}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值