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 + "]";
}
}