java批量导入数据到数据库,mysql高效导入大批量数据
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
首先看下我们的目标:向关系型数据库数据库中批量插入10000条数据
操作环境:Mysql和爪哇代码都运行在我本地Windows操作系统操作系统电脑(i7处理器,4核,16G运行内存,64位操作系统
1、JPA单线程执行
代码省略,大概需要39S左右
2、JPA多线程执行
大概需要37S左右,并没有想象中的快很多
(免费学习视频分享:java视频教程)
原因:多线程只是大大提高了程序处理数据的时间,并不会提高插入数据库的时间,相反在我这边作业的装配区(JobPackArea)的框架下,多线程也就意味着多连接,反而更加消耗数据库性能
包com。举例。演示。控制器;
导入com。举例。演示。实体。学生;
导入com。举例。演示。服务。学生服务接口;
导入org。spring框架。豆子。工厂。注释。自动连线;
导入org。spring框架。网络。绑定。注释。获取映射;
导入org。spring框架。网络。绑定。注释。请求映射;
导入org。spring框架。网络。绑定。注释。休息控制器;
导入javax。XML。绑定。验证异常;
导入Java。util。ArrayList
导入Java。util。日期;
导入Java。util。列表;
导入Java。util。并发。countdownlatch
导入Java。util。并发。执行服务;
导入Java。util。并发。遗嘱执行人;
@RestController
@RequestMapping(/student )
公共类学生控制器{
@自动连线
私立学生服务接口学生服务接口;
//来使主线程等待线程池中的线程执行完毕
私有CountDownLatch线程信号;
//每个线程处理的数据量
私有静态最终整数计数=1000
//我的电脑为四核线程池大小设置为2N 1
私有静态执行者服务执行者=执行者。newfixedthreadpool(9);
/**
* 多线程保存
*
* @返回
* @抛出验证异常
*/
@GetMapping()
公共字符串saveStudentEnableThread()引发验证异常{
长开始=新日期()。getTime();
//需要插入数据库的数据
list student list=new ArrayList();
for(int I=0;我10000;i ) {
学生学生=新生();
student.setName(张三);
学生。setage(10);
list.add(学生);
}
尝试{
if (list.size()=count) {
threads signal=new CountDownLatch(1);
execPool.submit(新插入日期(列表));
}否则{
ListListStudent lists=交易数据(列表,计数);
threads signal=new CountDownLatch(列表。size());
对于(列表学生学生:列表){
execPool.submit(新插入日期(学生));
}
}
线程信号。await();
} catch(异常e) {
System.out.println(e.toString()错误所在行数: e.getStackTrace()[0].getline number());
}
//结束时间
长结束=新日期()。getTime();
返回10000英镑条数据插入花费时间:(end-begin)/1000 s ;
}
/**
* 数据组装
* 把每个线程要处理的数据再组成一个目录
* 我这边就是把10000条数据组成10个1000条的集合
*
* @param target数据源
* @param size每个线程处理的数量
* @返回
*/
公共静态列表学生交易数据(列表学生目标,整数大小){
ListListStudent threadList=new ArrayListListStudent();
//获取被拆分的数组个数
int arrSize=target。size()% size==0?目标。size()/size:target。size()/size 1;
for(int I=0;我结婚了;i ) {
list students=new ArrayList student();
//把指定索引数据放入到目录中
for(int j=I * size;j=大小*(我^ 1)-1;j ) {
if (j=target.size() - 1) {
学生。添加(目标。get(j));
}
}
threadList.add(学生);
}
返回线程列表
}
/**
* 内部类,开启线程批量保存数据
*/
类插入日期扩展线程{
list student list=new ArrayList student();
公共插入日期(列表学生学生){
列表=学生;
}
公共无效运行(){
尝试{
//与数据库交互
学生服务接口。保存(列表);
线程信号。倒计时();
} catch (ValidationException e) {
e。printstacktrace();
}
}
}
}3、传统数据库编程插入
大概需要8S左右,相较于前两种方式已经快很多了,代码如下:
包com。举例。演示。控制器;
导入org。spring框架。网络。绑定。注释。获取映射;
导入org。spring框架。网络。绑定。注释。请求映射;
导入org。spring框架。网络。绑定。注释。休息控制器;
导入javax。XML。绑定。验证异常;
导入Java。SQL。连接;
导入Java。SQL。司机经理;
导入Java。SQL。准备好的声明;
导入Java。util。日期;
@RestController
@RequestMapping(/student1 )
公共类学生控制器1 {
@GetMapping()
公共字符串saveStudentEnableThread()引发验证异常{
//开始时间
长开始=新日期()。getTime();
连接连接=空
尝试{
连接=驱动程序管理器。getconnection( JDBC:MySQL://localhost:3306/db01?字符编码=ut F8使用unicode=true使用SSL=false服务器时区=UTCallowPublicKeyRetrieval=true , admin , 123456 );//获取连接
如果(连接!=null) {
System.out.println(获取连接成功);
}否则{
System.out.println(获取连接失败);
}
//这里必须设置为假的,我们手动批量提交
联系。设置自动提交(false);
//这里需要注意,SQL语句的格式必须是预处理的这种,就是价值观(?),否则批处理不起作用
准备报表语句=连接。准备陈述(“插入学生(id,‘姓名’,年龄)值(?));
//塞数据
for(int I=0;我10000;i ) {
statement.setInt(1,I 1);
statement.setString(2,张三);
statement.setInt(3,10);
//将要执行的结构化查询语言语句先添加进去,不执行
声明。add batch();
}
//提交要执行的批处理,防止数据库编程执行事务处理
声明。执行batch();
联系。commit();
//关闭相关连接
声明。close();
联系。close();
} catch(异常e) {
e。printstacktrace();
}
//结束时间
长结束=新日期()。getTime();
//耗时
System.out.println(10000条数据插入花费时间:(end-begin)/1000 s );
返回10000英镑条数据插入花费时间:(end-begin)/1000 s ;
}
}4、最后检查一下数据是否成功存库,一共30000条,没有丢数据
完成!
相关推荐:java入门教程以上就是爪哇岛向关系型数据库数据库批量插入大量数据的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。