MySQL批量插入4千万条数据,想问下各位大佬还有没有优化的可能
目前有15个txt文件,前14个都有300万行插入语句,插入语句示例如下
INSERT INTO sys_user(id,username,nickname,gender,password,avatar,mobile,status,email,is_deleted,content) VALUES(null,'15664152532','激动的篮球',1,'123456','http://','15664152532',1,'15664152532@qq.com',0,'null');
INSERT INTO sys_user(id,username,nickname,gender,password,avatar,mobile,status,email,is_deleted,content) VALUES(null,'18209582100','跳跃的汽车',1,'123456','http://','18209582100',1,'18209582100@qq.com',0,'null');
INSERT INTO sys_user(id,username,nickname,gender,password,avatar,mobile,status,email,is_deleted,content) VALUES(null,'15278230034','暴躁的啤酒',1,'123456','http://','15278230034',1,'15278230034@qq.com',0,'null');
我采用了3个线程同时处理三个txt文件,900万条数据一共花了2个小时,
private static void batchInsert(String filePath) throws SQLException {
Connection connection = null;
Statement statement = null;
try {
// 连接到MySQL数据库
connection = DriverManager.getConnection(JDBC_URL, USER, PASSWORD);
// 关闭自动提交,提高性能
connection.setAutoCommit(false);
// 从txt文件中读取插入语句
List<String> insertStatements = readInsertStatementsFromTxt(filePath);
// 使用 Statement,不支持动态参数设置
statement = connection.createStatement();
int i = 0;
// 插入数据
for (String sql : insertStatements) {
i++;
// 添加到批处理
statement.addBatch(sql);
//每1000条提交一次并清空
if (i % 100000 == 0) {
// 执行批处理
statement.executeBatch();
connection.commit();
statement.clearBatch();
}
}
statement.executeBatch();
connection.commit();
System.out.println(filePath + insertStatements.size() + "Data inserted successfully.");
} catch (SQLException | IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws SQLException {
long start = System.currentTimeMillis();
ExecutorService executor = Executors.newFixedThreadPool(3);
//Future<?> future1 = executor.submit(() -> {
// try {
// batchInsert("sql.txt");
// System.out.println("sql文件写入成功");
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
//});
//Future<?> future2 = executor.submit(() -> {
// try {
// batchInsert("sql1.txt");
// System.out.println("sql1文件写入成功");
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
//});
//Future<?> future3 = executor.submit(() -> {
// try {
// batchInsert("sql2.txt");
// System.out.println("sql2文件写入成功");
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
//});
Future<?> future4 = executor.submit(() -> {
try {
batchInsert("sql3.txt");
} catch (Exception e) {
throw new RuntimeException(e);
}
});
Future<?> future5 = executor.submit(() -> {
try {
batchInsert("sql4.txt");
} catch (Exception e) {
throw new RuntimeException(e);
}
});
Future<?> future6 = executor.submit(() -> {
try {
batchInsert("sql5.txt");
} catch (Exception e) {
throw new RuntimeException(e);
}
});
try {
//future1.get();
//future2.get();
//future3.get();
future4.get();
future5.get();
future6.get();
System.out.println("所有任务执行完毕");
} catch (InterruptedException | ExecutionException e) {
System.err.println("An error occurred while executing tasks: " + e.getMessage());
e.printStackTrace();
}
System.out.println("合计用时:" + (System.currentTimeMillis() - start));
}
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
内容推荐
我是项目小白,第一次做项目。因为之前赶进度,有些基础课程跟着敲了代码有些没有,但感觉很多也遗忘了,基础比较弱。总感觉自己有点浮躁。做项目的时候,会感觉没有思路,然后就问ai,问ai这个功能要怎么实现,我该怎么思考,但是ai给了我思路,我拿到手还是不会做。因为我不知道调哪个类,用什么方法合适,然后就依赖ai给的代码,然后就一直问ai为啥为啥这么做,让ai总结笔记。还好ai不嫌我烦,只图我的钱🤣。我
3
面试鸭
0
大家在编程导航中是怎么学习项目的呀,我最近在学习 AI 网关项目 python 版本,项目本地可以跑起来,已经按照教程看了一遍了,但还是一头雾水呀,回过头来看感觉还是很生涩,看不明白。首先在学习的过程中我需要定位到源码当中去看,但是教程没法直接逐行复制,导致我必须先粘贴到记事本,然后再复制函数名,在 pycharm 中全局检索才能找到,有时候还找不到...,其次我感觉教程文字太生硬了,有种惜字如金
1
idea2025.3版本创建springboot项目时想使用springboot3的没有怎么办,我在网上查是使用spring boot4的创建后再修改pom.xml文件之后每次都要这样改吗,修改的话不止版本号要修改
2
这些个企业开发中有必要删除吗,我有时候删除了启动类就编程.java 的格式无法运行了
1
作者分享
兄弟们,想求几份比较好一点的Java后端简历,感觉自己学的有点乱了,现在已经学完了Spring Cloud 各个中间件,设计模式等,但是想整理一下技术点,参考一下各位大佬的简历,目前研一结束了,明年准备秋招实习
2
各位大佬好,我想自己做一个通用前后端分离的后台管理,但是对于动态路由,和后端对接,一般情况RBAC模型下(user表,role表,user_role表,menu表(M,C,F),menu_role表)给前端返回路由信息该如何返回,
这里我的想法是,
登陆,用userid获取role然后关联获取menu表(!='F')获取数据,封装树结构返回,然后按钮权限再用一个service获取得到封装返回
没有实习过,导致现在没有企业做项目的经验
6
