【解决方案】Mysql 数据库千万数据插入脚本

一.背景

      要做数据模拟,需要在测试环境创建7千万的流水数据,进行迁移的模拟动作。

二.具体代码

 private static final String DB_URL = "jdbc:mysql://IP:3306/twallet_dev?zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useAffectedRows=true&rewriteBatchedStatements=true";private static final String USER = "root";private static final String PASS = "123456";private static final String TABLE_NAME = "tstd_jour_copy1";private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");private static final DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyyMMdd");private SnowflakeIdWorker snowflakeIdWorker = new SnowflakeIdWorker(0,0);public void testinsert() {try {Class.forName("com.mysql.cj.jdbc.Driver");Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);String sql = "INSERT INTO " + TABLE_NAME + " (`code`, `type`, `user_id`, `account_number`, `account_type`, `currency`, `biz_type`, `biz_note`, `en_biz_note`, `trans_object`, `trans_object_user_id`, `trans_amount`, `pre_amount`, `post_amount`, `status`, `push_status`, `channel_type`, `channel_order`, `prev_jour_code`, `ref_no`, `remark`, `create_datetime`, `work_date`, `check_user`, `check_note`, `check_datetime`, `adjust_user`, `adjust_note`, `adjust_datetime`, `trans_order_no`, `subsidiary_code`)" +" VALUES (?, ?, ?, ?, ?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";PreparedStatement pstmt = conn.prepareStatement(sql);conn.setAutoCommit(false);LocalDate startDate = LocalDate.of(2022, 1, 1);for (int i = 1; i < 15000000; i++) {int randomDay = random.nextInt(365) + 1; // 添LocalDate randomDate = startDate.plusDays(randomDay);String formattedDate = randomDate.atStartOfDay().format(formatter);String formattedDatesd = randomDate.atStartOfDay().format(formatter2);pstmt.setString(1,"AJ" + snowflakeIdWorker.nextId() + "");//codepstmt.setString(2,"1");pstmt.setString(3,"U20200218112349891757358");pstmt.setString(4,"A202002181123499425288");pstmt.setString(5,"C");pstmt.setString(6,"Points");pstmt.setString(7,"otc_sell_frozen");pstmt.setString(8,"出售冻结提交购买订单");pstmt.setString(9,null);pstmt.setString(10,null);pstmt.setString(11,null);pstmt.setBigDecimal(12,new BigDecimal(28000000000L));pstmt.setBigDecimal(13,new BigDecimal(0L));pstmt.setBigDecimal(14,new BigDecimal(28000000000L));pstmt.setString(15,"1");pstmt.setString(16,null);pstmt.setString(17,"0");pstmt.setString(18,null);pstmt.setString(19,null);pstmt.setString(20,"OO20200218150028928325362");pstmt.setString(21,"记得对账哦");pstmt.setString(22,formattedDate);pstmt.setString(23,formattedDatesd);pstmt.setString(24,null);pstmt.setString(25,null);pstmt.setString(26,null);pstmt.setString(27,null);pstmt.setString(28,null);pstmt.setString(29,null);pstmt.setString(30,null);pstmt.setString(31,"tbay000000001");pstmt.addBatch();if (i % 10000 == 0) {pstmt.executeBatch();pstmt.clearBatch();System.out.println("Inserted records up to index: " + i);}}pstmt.executeBatch();pstmt.clearBatch();conn.setAutoCommit(true);pstmt.close();conn.close();} catch (ClassNotFoundException | SQLException se) {// Handle errors for JDBCse.printStackTrace();}}public class SnowflakeIdWorker {private static final long twepoch = 1288834974657L; // Twitter Snowflake epoch时间戳private static final long workerIdBits = 5L;      // 工作节点ID位数private static final long datacenterIdBits = 5L;   // 数据中心ID位数private static final long maxWorkerId = -1L ^ (-1L << workerIdBits); // 最大工作节点IDprivate static final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); // 最大数据中心IDprivate static final long sequenceBits = 12L;       // 序列号位数private static final long workerIdShift = sequenceBits; // 工作节点ID左移位数private static final long datacenterIdShift = sequenceBits + workerIdBits; // 数据中心ID左移位数private static final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; // 时间戳左移位数private static final long sequenceMask = -1L ^ (-1L << sequenceBits); // 序列号掩码private long workerId;  // 工作节点IDprivate long datacenterId; // 数据中心IDprivate long sequence = 0L; // 序列号private long lastTimestamp = -1L; // 上次生成ID的时间戳public SnowflakeIdWorker(long workerId, long datacenterId) {if (workerId > maxWorkerId || workerId < 0) {throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));}if (datacenterId > maxDatacenterId || datacenterId < 0) {throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));}this.workerId = workerId;this.datacenterId = datacenterId;}/*** 生成下一个ID** @return 下一个ID*/public synchronized long nextId() {long timestamp = timeGen();// 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过,抛出异常if (timestamp < lastTimestamp) {throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));}// 如果是同一毫秒内生成的,则进行序列号自增if (lastTimestamp == timestamp) {sequence = (sequence + 1) & sequenceMask;// 检查是否溢出:每个节点每毫秒能够产生的序列数最大是4096,如果溢出则需要等待到下一毫秒if (sequence == 0) {timestamp = tilNextMillis(lastTimestamp);}} else {// 时间戳改变,重置序列号sequence = 0L;}// 更新上次生成ID的时间戳lastTimestamp = timestamp;// 移位并通过或运算拼接成64位IDreturn ((timestamp - twepoch) << timestampLeftShift)| (datacenterId << datacenterIdShift)| (workerId << workerIdShift)| sequence;}/*** 获取当前时间戳** @return 当前时间戳*/protected long timeGen() {return System.currentTimeMillis();}/*** 等待到下一毫秒** @param lastTimestamp 上次生成ID的时间戳* @return 下一毫秒的时间戳*/protected long tilNextMillis(long lastTimestamp) {long timestamp = timeGen();while (timestamp <= lastTimestamp) {timestamp = timeGen();}return timestamp;}}

三.注意

    1. mysql的连接需要增加参数  rewriteBatchedStatements=true

    2.自动提交的要关掉,代码手动提交事物

   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/860573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Mybatis-Plus》系列文章目录

什么是 MyBatis-Plus&#xff1f; Mybatis-Plus是一个在MyBatis基础上进行增强和扩展的开源Java持久层框架。 Mybatis-Plus&#xff08;简称MP&#xff09;旨在简化开发、提高效率&#xff0c;通过提供一系列便捷的功能和工具&#xff0c;大幅度减少开发人员编写重复代码的时…

element-ui 下拉菜单el-dropdown-item添加点击事件

使用element-ui下拉菜单组件Dropdown时绑定点击事件&#xff0c;事件不生效。 click 常见于其用在Vue中的事件绑定&#xff0c;而实际上是 v-on 的简写&#xff0c;而 v-on 则是对 vue 的事件体系封装之后的 API接口。 native修饰符用于处理DOM原生事件&#xff0c;由于组件 …

如何在web页面下做自动化测试?

自动化测试是在软件开发中非常重要的一环&#xff0c;它可以提高测试效率并减少错误率。在web页面下进行自动化测试&#xff0c;可以帮助我们验证网页的功能和交互&#xff0c;并确保它们在不同浏览器和平台上的一致性。本文将从零开始&#xff0c;详细介绍如何在web页面下进行…

10--7层负载均衡集群

前言&#xff1a;动静分离&#xff0c;资源分离都是在7层负载均衡完成的&#xff0c;此处常被与四层负载均衡比较&#xff0c;本章这里使用haproxy与nginx进行负载均衡总结演示。 1、基础概念详解 1.1、负载均衡 4层负载均衡和7层负载均衡是两种常见的负载均衡技术&#xff…

PHP 语言特定指南

PHP 语言特定指南 本指南将教您如何使用 Docker 创建容器化的 PHP 应用程序。通过本指南&#xff0c;您将学习如何&#xff1a; 容器化并运行一个 PHP 应用程序设置用于开发 PHP 应用程序的本地环境在容器内运行 PHP 应用程序的测试使用 GitHub Actions 配置容器化 PHP 应用程…

vite+vue3+ts项目搭建流程 (pnpm, eslint, prettier, stylint, husky,commitlint )

vitevue3ts项目搭建 项目搭建项目目录结构 项目配置自动打开项目eslint①vue3环境代码校验插件②修改.eslintrc.cjs配置文件③.eslintignore忽略文件④运行脚本 prettier①安装依赖包②.prettierrc添加规则③.prettierignore忽略文件④运行脚本 stylint①.stylelintrc.cjs配置文…

前端自动化

前端自动化的内容 自动化代码检查自动化测试自动化构建自动化部署自动化文档 前端自动化的最佳实践

基于改进YOLOv5的安全帽检测算法 | 引入Ghost卷积 + 添加CA注意力机制 + 更换Neck网络之BiFPN + 更换损失函数之WIoU

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。为了解决建筑工地、隧道、煤矿等施工场景中现有安全帽检测算法对于小目标、密集目标以及复杂环境下的检测精度低的问题&#xff0c;设计实现了一种基于YOLOv5的改进目标检测算法&#xff0c;记为YOLOv5-GBCW。首先使用Ghos…

心理健康测试系统设计

心理健康测试系统设计需要综合考虑多个方面&#xff0c;以确保系统的准确性、易用性和有效性。以下是一个心理健康测试系统设计方案&#xff1a; 一、设计目标 准确性&#xff1a;确保测试结果能够准确反映被测者的心理健康状况。 易用性&#xff1a;设计简洁明了的界面和操作…

C语言 | Leetcode C语言题解之第166题分数到小数

题目&#xff1a; 题解&#xff1a; struct HashMapNode {int key;int val;UT_hash_handle hh; };struct HashMapNode* hashMap NULL;int hashMapAdd(int key, int val) {struct HashMapNode* node;HASH_FIND_INT(hashMap, &key, node);if(node ! NULL){return node->…

openai停止中国的api服务,但是性能相当的阿里云免费提供迁移

&#x1f3a5; 开场白&#xff1a; “大家好&#xff0c;我是你们的科技小助手&#xff0c;今天给大家带来一个重要的信息更新&#xff01;” &#x1f310; 引入话题&#xff1a; “最近&#xff0c;许多朋友可能已经听说了&#xff0c;OpenAI决定停止对中国的服务。但别担心…

fiddler抓https包

1&#xff0c;安装fiddler省略 2&#xff0c;下载证书步骤&#xff1a;tools-options-https 点击确认&#xff0c;点击OK&#xff0c;点击是 把证书安装到谷歌浏览器上步骤&#xff1a;点击谷歌浏览器右上角的设置&#xff0c;在搜索框中搜索证书&#xff0c;点击“证书管理”…

从0搭建一个vue项目,不使用脚手架从html到vue

前言 从最开始学习web网页开始&#xff0c;搭建一个网页只需要创建一个html文件对其进行编写dom标签语言即可&#xff1b;后来分离了html&#xff0c;css和js&#xff0c;搭建一个网页开始需要文件夹&#xff0c;文件夹包含了这3类文件以及静态文件&#xff0c;图片&#xff0c…

备战秋招day4

算法 242. 有效的字母异位词 class Solution {public boolean isAnagram(String s, String t) {int[] count new int[26];for(int i 0;i<s.length();i){count[s.charAt(i)-a];}for(int i 0;i<t.length();i){count[t.charAt(i)-a]--;if(count[t.charAt(i)-a]<0){r…

【CSS】 简单理解一下CSS 3D变换

CSS 3D变换是Web开发中一项强大的技术&#xff0c;它允许开发者在网页上创建和展示三维图形和动画。以下是关于CSS 3D变换的深入浅出介绍&#xff1a; 一、3D变换基础 坐标轴&#xff1a; X轴&#xff1a;水平向右&#xff0c;正方向为右&#xff0c;负方向为左。Y轴&#xff…

【会议征稿】2024年应用计算智能、信息学与大数据国际会议(ACIIBD 2024,7月26-28)

2024年应用计算智能、信息学与大数据国际学术会议&#xff08;ACIIBD 2024&#xff09;将于2024年7月26-28日在中国广州举办。会议将聚焦于计算智能及其应用、信息、大数据等相关的研究领域&#xff0c; 广泛邀请国内外知名专家学者&#xff0c;共同探讨相关学科领域的最新发展…

26.高级特性(上)

目录 一、不安全的Rust二、不安全的超能力2.1 概念2.2 解引用裸指针2.3 调用不安全的函数或方法2.3 创建不安全代码的安全抽象2.4 使用extern函数调用外部代码2.5 访问或修改可变静态变量2.6 实现不安全trait2.7 访问联合体中的字段 三、高级trait3.1 关联类型在trait定义中指定…

【昇思初学入门】第七天打卡-模型训练

训练模型 学习心得 构建数据集。这通常包括训练集、验证集&#xff08;可选&#xff09;和测试集。训练集用于训练模型&#xff0c;验证集用于调整超参数和监控过拟合&#xff0c;测试集用于评估模型的泛化能力。 &#xff08;mindspore提供数据集https://www.mindspore.cn/d…

使用Python和NLTK进行NLP分析的高级指南

在本文中&#xff0c;将利用数据集来比较和分析自然语言。 本文涵盖的基本构建块是&#xff1a; WordNet和同义词集相似度比较树和树岸命名实体识别 WordNet和同义词集 WordNet是NLTK中的大型词汇数据库语料库。WordNet维护与名词&#xff0c;动词&#xff0c;形容词&#…

Unity 弧形图片位置和背景裁剪

目录 关键说明 Unity 设置如下 代码如下 生成和部分数值生成 角度转向量 计算背景范围 关键说明 效果图如下 来自红警ol游戏内的截图 思路&#xff1a;确定中心点为圆的中心点 然后 计算每个的弧度和距离 Unity 设置如下 没什么可以说的主要是背景图设置 代码如下 …