一次生成20条数据,分两次生成

211 阅读1分钟

背景

  制造模拟数据,一次生成5000000条数据,每500条数据向数据库中插入一次示例。

正确代码示例:

package testClass;

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

public class ScopeClass {
    public static Integer global=0;
    public static Integer count=0;

    public static void main(String[] args) {
        //分多少次向数据库中插入数据,这里是两次
        for (int i=0; i <2; i++){
            List<Integer> result = DealData.dealData(global);
            count += result.size();
            global = count;
        }
        System.out.println("count="+count);
    }
}


package testClass;
import java.util.ArrayList;
import java.util.List;
public class DealData {
    //一次生成多少条数据,这里5条
    public static List<Integer> dealData(Integer global){
        System.out.println("入参global="+global);
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 5; i++){
            global++;
            list.add(global);
            System.out.println("gl="+global);
        }
        return list;
    }
}

输出的结果:

image.png

错误代码示例

package testClass;
import java.util.ArrayList;
import java.util.List;
public class ScopeClass {
    public static Integer global=0;
    public static Integer count=0;

    public static void main(String[] args) {
        //分多少次向数据库中插入数据,这里是两次
        for (int i=0; i <2; i++){
            List<Integer> result = DealData.dealData(global);
            count += result.size();
        }
        System.out.println("count="+count);
    }
}

package testClass;
import java.util.ArrayList;
import java.util.List;
public class DealData {
    //一次生成多少条数据,这里5条
    public static List<Integer> dealData(Integer global){
        System.out.println("入参global="+global);
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 5; i++){
            global++;
            list.add(global);
            System.out.println("gl="+global);
        }
        return list;
    }
}

输出的结果

image.png

分析

  两个成员变量,每执行完一次,都会重新把成员变量的默认值赋值为定义的值,所以每次执行完都要,将最后结果赋值给成员变量更新。保证数据每次都会接着上传自增。

原子变量的操作

  当在并发的情况下,上面的代码,可能会出现脏数据。对上面的优化,需要我们使用原子变量进行操作。

正确的代码示例:

package testClass;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class ScopeSynchronizedClass {
    public static AtomicInteger at = new AtomicInteger(0);
    public static Integer count = 0;

    public static void main(String[] args) {
        //分两次插入数据
        for (int i = 0; i < 2; i++){
            List<AtomicInteger> result = DealData.SynDealData(at);
            count += result.size();
            //关键在这需要重置一下变量内容
            at.set(count);
            System.out.println("at1="+at.get());
        }
    }
}


package testClass;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class DealData {
    //安全自增1
    public static List<AtomicInteger> SynDealData(AtomicInteger at){
        System.out.println("入参at="+at);
        List<AtomicInteger> list = new ArrayList<>();
        for (int i = 0; i < 5; i++){
            at.incrementAndGet();
            list.add(at);
            System.out.println("at="+at);
        }
        return list;
    }
}

输出的结果

image.png
加微信群一块学习讨论技术Day9884125