java快速的生成測試資料

weixin_33912246發表於2017-12-02

       一個程式設計師,需要時刻關注新的技術方向,或者回顧一些老的技術知識,來完善自己的技術棧,或者加深細化某些知識點,思而不學則怠,所以我們需要一些測試來夯實我們的技術理論,如何短時間(數小時)獲取數以億計的測試資料?

總體的思路是:定時任務,多執行緒,批量插入,優化資料庫引數。

通過定時任務,可以讓程式按照一定的時間(如幾秒)自動觸發一次;利用執行緒池,每次觸發的時候,都有一個執行緒去處理程式,這樣是單執行緒的數倍獲取測試資料;在利用批量插入,可以一次插入50000條資料(具體量,可以根據jvm的記憶體看),每次程式迴圈執行100次,這樣,一個執行緒,執行一次程式可以獲取5000000的資料量,更具mysql的效能是沒有問題的,大概需要兩根分鐘左右,多個執行緒一起,可以獲取跟多的資料,具體程式如下:

測試實體(和資料庫的table對應)

public classTbTest {

privateIntegerid;

privateStringname;

privateIntegerage;

privateDatebrithday;

privateIntegerhigh;

privateIntegerwigth;

privateStringschool;

privateStringhappy;

privateShortisboy;

省略getter,setter方法

}

多執行緒定時任務:

@Scheduled(cron ="0/30 * * * * ?")

public voidschudleThread()throwsException {

ExecutorService tp = Executors.newCachedThreadPool();

tp.execute(newRunnable() {

@Override

public voidrun() {

logger.info("==========開始批處理 當前的執行緒名稱為 ==== "+Thread.currentThread().getName()+"=========");

String[] f =newString[]{"張","王","周","武","李",

"胡","趙","陳","苗","戴","習","毛","朱","韓","陸"};

String[] s =newString[]{"克","明","發","代發","犯的",

"和","我","人","同","娟","娟娟","麗","美麗","利","陸"

,"空間","改","辦法","航空",

"留","泰","晨光","長城","層層","莉莉","胡霍","娜娜","大","光榮"};

Random random =newRandom();

longc = System.currentTimeMillis();

List tests =newArrayList<>(100);

for(inti =0; i <500000; i++) {

if(i >0&& (i %40000) !=0) {

TbTest tbTest =newTbTest();

tbTest.setAge(random.nextInt(100));

try{

tbTest.setBrithday(DateUtil.parseDate(random.nextInt(2017) +"-"+ random.nextInt(12)

+"-"+ random.nextInt(30) +" "+ random.nextInt(24) +":"+ random.nextInt(60) +":"+ random.nextInt(60),"yyyy-MM-dd HH:mm:ss"));

}catch(ParseException e) {

e.printStackTrace();

}

tbTest.setHigh(random.nextInt(200));

tbTest.setIsboy((short) random.nextInt(2));

tbTest.setName(f[random.nextInt(f.length-1)] + s[random.nextInt(s.length-1)]);

tbTest.setSchool("學院"+ random.nextInt(10000));

tbTest.setWigth(random.nextInt(200));

tests.add(tbTest);

}

if(i >0&& (i %40000) ==0) {

tbTestMapper.inserts(tests);

tests.clear();

}

}

logger.info("耗時:"+ (System.currentTimeMillis() - c) /1000);

}

});

}

mapper檔案

@Component

public interfaceTbTestMapper {

intbatchinsert(@Param("tests") List tests);

}

xml檔案sql

insert into tb_test

name,

age,

brithday,

high,

wigth,

school,

happy,

isboy


6523063-27e54564be112b31.png

相關文章