今天在做性能测试时,突然发现,压测过去的数据,好多都出现了 log_id重复的问题, 之前也都没有遇到过,之前的log_id都是用System.currentTimeMillis()+""来直接生成的,想着生成的时间戳都是毫秒级别的,不会出现完全相同的情况,就算是并发,100以内的并发量并不大额
可是,重复的数据还是产生了,就10个并发都会产生相同的时间戳,BeanShell PreProcessor难道是同一时刻执行的,对于jmeter中如何调用java的jvm来执行脚本,原理不是很清楚,求大神指点。。。。。。。
然后从同事介绍哪里,知道了UUID这个强大的工具,原来java还有这个工具,直接在BeanShell PreProcessor中加上这个,就可以直接生成log_id了,太神奇了,
String Str1=UUID.randomUUID().toString().replace("-", "");
通用唯一识别码(英语:Universally Unique Identifier,简称UUID)是一种软件建构的标准,亦为自由软件基金会组织在分散式计算环境领域的一部份。UUID的目的,是让分散式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定,如此一来,每个人都可以创建不与其它人冲突的UUID,每一毫秒内都能生成无穷多的不同的串
一组UUID,是由一串16位组(亦称128位)的16进位数字所构成,是故UUID理论上的总数为216 x 8=2128,约等于3.4 x 1038。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完(完全不用考虑数据量的多少)所以无需考虑它的重复性,这真是java之光(⊙o⊙)…
同样的应用在MySQL中也可以直接使用,主要是用于生成数据插入到表中,比如常见的ID字段
SELECT UUID_SHORT();//生成17位数字组成的唯一id值,【长度为:(0 ~ 2^64-1) 10^19 20位数字】长度不固定,根据不同的mysqld服务来决定
SELECT UUID();//生成类似于这样的28c18005-afdb-11eb-871c-0242ac100003数字值
UUID_SHORT()
将“ 短 ”通用标识符作为64位无符号整数返回。返回的值 UUID_SHORT()与UUID()函数返回的字符串格式128位标识符 不同,并且具有不同的唯一性属性。UUID_SHORT()如果满足以下条件,则保证值 是唯一的:
- 在server_id当前服务器的值介于0和255之间,您的设置主从服务器中是唯一的
- 您不会在mysqld restarts 之间设置服务器主机的系统时间
- UUID_SHORT()在mysqld重启 之间, 你平均每秒调用的次数少于1600万次