有效数据生成以及插入数据库方案
先产生insert数据并存到备份文件中
因为有效数据生成的数量不大, 按照压测那边给我的需求大概每个交易4千笔数据左右,需要并发量比较高的交易也不过4万笔数据,涉及到转账的交易数据量比较高一点。并且需要做一个备份为了以后压测可以备用,因此我选择先生成到不同的表对应的表名文件中,然后再写一个批量执行SQL的程序执行这些文件中的insert语句
下面的代码做了脱敏处理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
上面的代码中,MultiThreadScript类是脚本的主类,它负责读取输入文件并创建线程池来处理每条insert语句。InsertTask类是插入任务类,它实现了Runnable接口,用于递增主键并生成新的SQL语句。为了避免多个线程同时写入输出文件,InsertTask类中使用了synchronized关键字来进行同步。
在getNextPk()方法中,我使用了类似于Excel中列名的递增方式来递增主键。首先,将原始主键分为前缀和后缀两部分,其中前缀是主键的前面部分,后缀是主键的最后一位字符。然后,对后缀进行递增,并根据递增后的后缀重新生成新的主键。
最后,需要注意的是,由于主键可能包含字母和数字,因此使用36进制来对主键进行递增。例如,对于主键值为"001",它的下一个值为"002";对于主键值为"AZ9",它的下一个值为"BA0"。
进行插入操作(脱敏处理后的代码):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
上面代码中我们把insert.sql取代为我们想要进行批量insert的sql文件即可,线程数量可根据CPU的情况来看,在不进行其他工作任务的情况下,可尽量压榨CPU的使用率以达到最高的效率。
亿级别的无效数据生成并插入数据库方案
这里因为涉及到的数据量特别大, 一般是模拟生产环境,因此一张表可能有千万级别以及亿级别的数据量,因此我选择一边生成一边做insert操作。也就是一个生产者一个消费者,当然,这里都是多线程来操作的。一开始我是每次达到20个事务一次提交的,后来换了OceanBase后,只能一次提交一个事务了,效率也变满了一点点. 对于多线程插入数据库,将生成的SQL语句分配给多个线程,每个线程使用单独的数据库连接插入数据库,可以使用线程池来管理多个线程 下面是脱敏后的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
这里使用了两个线程池,一个用于生成新的 SQL 语句,一个用于执行 SQL 语句。生成 SQL 语句的线程将生成的 SQL 语句存储到一个线程安全的队列中,执行 SQL 语句的线程从队列中取出 SQL 语句并执行插入操作。程序使用了 JDBC 连接 MySQL 数据库,并使用了 PreparedStatement 批量执行 SQL 语句,以提高插入效率。
需要注意的是,为了避免多个线程同时操作数据库导致数据不一致的问题,每个线程使用了自己的数据库连接。此外,程序还使用了线程安全的队列和加锁机制来保证线程安全。
总结
以上就是我在工作中遇到的问题之一,做一个小结,用到了很多线程和线程池的地方,以及操作数据库相关的知识。