任务: 从sqlserver中将一个表A(约16W条数据)导到mysql中对应的一个表B中。

思路:分段获取A表中的数据后,用多个线程同时向B表中写入。

关键代码

//将数据库中的数据条数分段

public void division(){

//获取要导入的总的数据条数

String sql3="SELECT count(*) FROM [CMD].[dbo].[mycopy1]";

try {

pss=cons.prepareStatement(sql3);

rss=pss.executeQuery();

while(rss.next()){

System.out.println("总记录条数:"+rss.getInt(1));

sum=rss.getInt(1);

}

//每30000条记录作为一个分割点

if(sum>=30000){

n=sum/30000;

residue=sum%30000;

}else{

residue=sum;

}

System.out.println(n+" "+residue);

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} 线程类

public MyThread(int start,int end) {

this.end=end;

this.start=start;

System.out.println("处理掉余数");

try {

System.out.println("--------"+Thread.currentThread().getName()+"------------");

Class.forName(SQLSERVERDRIVER);

System.out.println("加载sqlserver驱动...");

cons = DriverManager.getConnection(CONTENTS,UNS,UPS);

stas = cons.createStatement();

System.out.println("连接SQLServer数据库成功!!");

System.out.println("加载mysql驱动.....");

Class.forName(MYSQLDRIVER);

con = DriverManager.getConnection(CONTENT,UN,UP);

sta = con.createStatement();

// 关闭事务自动提交

con.setAutoCommit(false);

System.out.println("连接mysql数据库成功!!");

} catch (Exception e) {

e.printStackTrace();

}

// TODO Auto-generated constructor stub

}

public ArrayList getAll(){

Member member;

String sql1="select * from (select row_number() over (order by pmcode) as rowNum,*" +

" from [CMD].[dbo].[mycopy1]) as t where rowNum between "+start+" and "+end;

try {

System.out.println("正在获取数据...");

allmembers=new ArrayList();

rss=stas.executeQuery(sql1);

while(rss.next()){

member=new Member();

member.setAddress1(rss.getString("address1"));

member.setBnpoints(rss.getString("bnpoints"));

member.setDbno(rss.getString("dbno"));

member.setExpiry(rss.getString("expiry"));

member.setHispoints(rss.getString("hispoints"));

member.setKypoints(rss.getString("kypoints"));

member.setLevels(rss.getString("levels"));

member.setNames(rss.getString("names"));

member.setPmcode(rss.getString("pmcode"));

member.setRemark(rss.getString("remark"));

member.setSex(rss.getString("sex"));

member.setTelephone(rss.getString("telephone"));

member.setWxno(rss.getString("wxno"));

member.setPmdate(rss.getString("pmdate"));

allmembers.add(member);

//System.out.println(member.getNames());

}

System.out.println("成功获取sqlserver数据库数据!");

return allmembers;

} catch (SQLException e) {

// TODO Auto-generated catch block

System.out.println("获取sqlserver数据库数据发送异常!");

e.printStackTrace();

}

try {

rss.close();

stas.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}

public void inputAll(ArrayList allmembers){

System.out.println("开始向mysql中写入");

String sql2="insert into test.mycopy2 values (?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

try {

ps=con.prepareStatement(sql2);

System.out.println("-------------------------等待写入数据条数: "+allmembers.size());

for(int i=0;i

ps.setString(1, allmembers.get(i).getPmcode());

ps.setString(2, allmembers.get(i).getNames());

//System.out.println(allmembers.get(i).getNames());

ps.setString(3, allmembers.get(i).getSex());

ps.setString(4, allmembers.get(i).getTelephone());

ps.setString(5, allmembers.get(i).getAddress1());

ps.setString(6, allmembers.get(i).getPmdate());

ps.setString(7, allmembers.get(i).getExpiry());

ps.setString(8, allmembers.get(i).getLevels());

ps.setString(9, allmembers.get(i).getDbno());

ps.setString(10, allmembers.get(i).getHispoints());

ps.setString(11, allmembers.get(i).getBnpoints());

ps.setString(12, allmembers.get(i).getKypoints());

ps.setString(13, allmembers.get(i).getWxno());

ps.setString(14, allmembers.get(i).getRemark());

//插入命令列表

//ps.addBatch();

ps.executeUpdate();

}

//ps.executeBatch();

con.commit();

ps.close();

con.close();

this.flag=false;

System.out.println(Thread.currentThread().getName()+"--->OK");

} catch (SQLException e) {

// TODO Auto-generated catch block

System.out.println("向mysql中更新数据时发生异常!");

e.printStackTrace();

}

}

@Override

public void run() {

// TODO Auto-generated method stub

while(true&&flag){

this.inputAll(getAll());

}

}

测试类:

public class Test1 {

DbManager dm=null;

MyThread my1=null;

public Test1(){

dm=new DbManager();

System.out.println(dm.n+"----"+dm.residue);

if(dm.n<1){//数据条数小于30000单线程处理

my1=new MyThread(1,dm.sum);

my1.start=1;

my1.end=dm.residue;

Thread t1=new Thread(my1);

t1.start();

}else{//大于30000时

//起n个线程 每个处理30000条数据

for (int i = 1; i <=dm.n; i++) {

new Thread(new MyThread(i)).start();

try {

Thread.sleep(1);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

//处理掉余数

my1=new MyThread(dm.n*30000+1,dm.sum);

Thread t1=new Thread(my1);

t1.start();

}

}

public static void main(String[] args) {

//new Test1();

//迁移完数据,自动关机

try {

Runtime.getRuntime().exec("cmd /c Shutdown -t 10");

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

经过多次测试:从sqlserver中读取16w条数据并写入mysql,耗时15min左右。

开始会报错: java heap space

解决方案:(myeclipse)window->Preferences->Java->Installed JREs,选择当前的JRE,然后edit它;在新窗口里设置Default VM Arguments为 -Xms512M -Xmx512M即可 :

java多线程写数据到数据库6_java多线程向数据库写入数据相关推荐

  1. python多线程写日志_python 应用logging多线程写多个log文件

    python 使用logging多线程写多个log文件 import threading import time import logging import logging.handlers LEVE ...

  2. java poi 模板 导出_java poi 从服务器下载模板写入数据再导出

    最近写了一个,Excel 的 写入和导出.   需求是这样的.   在新建合同的时候,会有导出合同的数据,    导出的模板是固定的,,需要在模板里面写入合同的信息. first   :  下载模板 ...

  3. 多线程写文件_Shell简单实现多线程

    一.目的 解决Shell脚本单线程下效率低下的问题 二.适用场景 需要在Linux系统执行同一项命令,但是针对不同的对象,例如PING检测主机,当然可以延展,只要是命令之间不会产生冲突就可以了 三.场 ...

  4. java代码里的JSON格式怎么写好看_python3 循环读取excel文件并写入json操作

    文件内容: excel内容: 代码: import xlrdimport jsonimport operatordef read_xlsx(filename): # 打开excel文件 data1 = ...

  5. 6.9 用Python操控数据库(批量删除,百度新闻数据爬取与存储,写入数据时进行去重处理,pandas读取sql数据)

    学习完MySQL数据库的基本操作后,下面来学习如何用Python连接数据库,并进行数据的插入.查找.删除等操作. 6.9.1 用PyMySQL库操控数据库 上一节在phpMyAdmin 中创建了数据库 ...

  6. Qt编写数据导出到Excel及Pdf和打印数据

    一.前言 用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询 ...

  7. mysql数据库前端缓存_MySQL数据库性能优化--缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  8. 建立数组并写入数据_Visual Studio 2010--C#跟西门子1200通讯(Sharp7)⑥--数据写入

    Visual Studio 2010--C#跟西门子1200通讯(Sharp7)⑥--数据写入 上期回顾(上2期主要编写了从PLC读取数据到缓冲区,再从缓冲区拿取需要的数据,并转换成C#格式): 本期 ...

  9. python读数据-用 Python 的输入输出功能读取和写入数据

    读取.写入和 Python 在 "探索 Python 系列" 以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如 tuple . string 和 list ...

  10. Java实现多线程写数据到文件【队列-文件】

    大致流程 先将要写入文件的数据写入到一个队列中,然后单开一个线程专门读取队列数据写入文件,可以保证写入到文件的数据的顺序, 生产者类即多线程写入文件模拟 package com.ldl.test.do ...

最新文章

  1. android xml转换成svg,如何将Android xml布局转换为png / svg以在iOS版本中使用
  2. ES6中定义的类和对象
  3. python语法syntaxerror怎么修改-Python 语法错误
  4. 365篇原创后,有三AI喊你正式加入来不来?
  5. 这100道面试题,用来忽悠半吊子面试官
  6. ASP.NET WebAPI Get和Post 传参总结
  7. Redis两种客户端:lettuce和Jedis的区别
  8. 《线程管理:线程基本操作》
  9. ordereddict有序字典
  10. 思科光传输功率查询_常见的6款40G QSFP+光模块型号介绍及应用
  11. java showinputdialog_java - JOptionPane.showInputDialog中的多个输入
  12. 使用Python完美管理和调度你的多个任务
  13. 《C程序设计新思维》一第6章 玩转指针6.1 自动、静态和手工内存
  14. 10.高性能MySQL --- 复制
  15. SPFA - Luogu 3385 【模板】负环
  16. linux根目录9个g,linux根目录下5个主要的目录,及目录的功能
  17. python爬虫——爬取汽车之家新闻
  18. 什么是数据库的实体关系图(ERD)?
  19. 微信小程序基于mpvue的ui组件之选择器
  20. Python 鸭子类型的理解

热门文章

  1. 190817每日一句
  2. Atitit.印章文化 印章的起源历史与发展 v2 r99 .docx
  3. Atitit 项目管理(5)----------后勤管理与工具链支持管理
  4. paip.取当天记录的方法sql跟hql hibernate
  5. paip.invalid conversion from FormWdg* to SOCKET {aka unsigned int}
  6. 专访凯美瑞德研发总监孟江华:银行间市场操作系统的自主可控亟待加强
  7. 对话Man Group:对冲基金的达尔文式竞争
  8. 五种开源API网关实现组件对比
  9. ajax中sy,黑马eesy_15 Vue:vue语法和生命周期与ajax异步请求
  10. 【数据预测】基于matlab BP+ELM+LSTM+BiLSTM+SAELSTM数据预测【含Matlab源码 1825期】