- 浏览: 953677 次
文章分类
- 全部博客 (428)
- Hadoop (2)
- HBase (1)
- ELK (1)
- ActiveMQ (13)
- Kafka (5)
- Redis (14)
- Dubbo (1)
- Memcached (5)
- Netty (56)
- Mina (34)
- NIO (51)
- JUC (53)
- Spring (13)
- Mybatis (17)
- MySQL (21)
- JDBC (12)
- C3P0 (5)
- Tomcat (13)
- SLF4J-log4j (9)
- P6Spy (4)
- Quartz (12)
- Zabbix (7)
- JAVA (9)
- Linux (15)
- HTML (9)
- Lucene (0)
- JS (2)
- WebService (1)
- Maven (4)
- Oracle&MSSQL (14)
- iText (11)
- Development Tools (8)
- UTILS (4)
- LIFE (8)
最新评论
-
Donald_Draper:
Donald_Draper 写道刘落落cici 写道能给我发一 ...
DatagramChannelImpl 解析三(多播) -
Donald_Draper:
刘落落cici 写道能给我发一份这个类的源码吗Datagram ...
DatagramChannelImpl 解析三(多播) -
lyfyouyun:
请问楼主,执行消息发送的时候,报错:Transport sch ...
ActiveMQ连接工厂、连接详解 -
ezlhq:
关于 PollArrayWrapper 状态含义猜测:参考 S ...
WindowsSelectorImpl解析一(FdMap,PollArrayWrapper) -
flyfeifei66:
打算使用xmemcache作为memcache的客户端,由于x ...
Memcached分布式客户端(Xmemcached)
JVM学习笔记:http://blog.csdn.net/cutesource/article/details/5904501
堆内存设置原理:http://blog.csdn.net/sivyer123/article/details/17139443/
JVM 之 GC日志分析 :http://blog.csdn.net/lan861698789/article/details/51985188
JVM client模式和Server模式的区别:http://developer.51cto.com/art/201009/228035.htm
垃圾收集器:http://yueyemaitian.iteye.com/blog/1185301
VisualVM分析器:http://www.cnblogs.com/linghu-java/p/5689227.html
MemoryAnalyzer使用:http://wensong.iteye.com/blog/1986449
MAT中Retained和Shallow区别:http://bjyzxxds.iteye.com/blog/1532937
应用场景:先需要将Mdb中的表中数据,全量迁移到Sdb中,一种方法用工具Kettle,第二种编写脚本,第三种程序迁移,第一与第二种迁移对大表没有问题,第三种,由于百万级数据表,全量从Mdb取出,再全量插入的Sdb,对内存的要求较高,比较有效的方法是分页查询,再插入;今天我们不讲的分页查询插入,来看全量从Mdb取出,再分批量插入的Sdb,关于分页分批插入(为应对内存问题,可以将查询结果存到文件,再从文件中读取插入),后续再讲。
主要代码:
下面的测试表记录数为28万
Tomcat:JavaOPT 默认
-client
-Xmx256M
JVM虚拟机默认启动时,client模式,垃圾模式为Serial New + Serial Old
当counts%10000==0,批量为10000,抛出OOM:java heap space
当Data d = new Data();放在循环外定义:Data d = null;抛出OOM:java heap space
当批量为5000时:
JConsole 堆信息:
2016-09-29 16:40:42
已使用: 107,876 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(326 项收集)所用的时间为 2.518 秒
MarkSweepCompact(171 项收集)所用的时间为 1 minute
所用时间s:220.66
VisualVM:
Viusal GC:
去除log.info("============Records:"+counts);
JConsole 堆信息:
时间: 2016-09-29 16:25:44
已使用: 244,748 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(332 项收集)所用的时间为 2.456 秒
MarkSweepCompact(114 项收集)所用的时间为 39.902 秒
所用时间s:163.09
这说明,不要打,不必要的log
VisualVM:
Viusal GC:
当批量为2000时:
JConsole 堆信息:
2000
时间: 2016-09-29 16:50:28
已使用: 252,652 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(321 项收集)所用的时间为 2.369 秒
MarkSweepCompact(106 项收集)所用的时间为 36.438 秒
所用时间s:145.524
VisualVM:
Viusal GC:
对比5000可以看出,堆内存的趋势图,更平缓,Copy及MarkSweepCompact收集次数减少,故所用时间降低。
当批量为1000时:
JConsole 堆信息:
时间: 2016-09-29 17:03:10
已使用: 249,215 Kb
分配: 253,440 Kb
最大值:253,440 Kb
GC 时间:
Copy(330 项收集)所用的时间为 2.299 秒
MarkSweepCompact(100 项收集)所用的时间为 34.530 秒
所用时间s:159.459
从所用时间和Copy及来看,比2000批次还有,MarkSweepCompact收集次数减少了6次
从5000,2000,1000来看说明,批次处理量对处理的速度有影响,应选择合适的批次数量。
下面调整一下
JavaOPT
-server
-XX:+PrintGCDetails
-Xloggc:E:\gc.log
Server模式下,垃圾回收器默认为PS Scavenge+ PS-Old
我的机器内存是8G,默认Server模式下,Xmx1024M ,同样的处理逻辑:
当批量为2000时:
JConsole 堆信息:
时间: 2016-09-29 17:12:41
已使用: 337,969 Kb
分配: 574,784 Kb
最大值: 932,096 Kb
GC 时间:
PS MarkSweep(6 项收集)所用的时间为 1.475 秒
PS Scavenge(74 项收集)所用的时间为 1.090 秒
全量更新所用时间s:114.25
当批量为5000时:
时间: 2016-09-29 17:19:26
已使用: 365,969 Kb
分配: 547,968 Kb
最大值: 932,096 Kb
GC 时间:
PS MarkSweep(6 项收集)所用的时间为 1.400 秒
PS Scavenge(70 项收集)所用的时间为 1.212 秒
所用时间s:107.12
从上可以看出新生代的收集次数减少,所用时间减少,这说明当堆内存增大时,可以相应的调整批量处理数,以提高处理效率。
我们来看看在-server,模式下能处理的最大记录数:
java OPTS:
-server
-Xms512M
-Xmx1024M
-XX:NewSize=384M
-XX:ParallelGCThreads=4
-XX:+PrintGCDetails
-Xloggc:E:\gc.log
时间: 2016-09-29 18:16:19
已使用: 1,004,657 Kb
分配: 1,028,288 Kb
最大值: 1,028,288 Kb
GC 时间:
PS MarkSweep(424 项收集)所用的时间为 10 minutes
PS Scavenge(121 项收集)所用的时间为 3.631 秒
在上述配置下,能够处理的最大记录数为1040000
总结:
从上的分析来看,批量处理的数量,应该根据堆内存的变化而调整,已达到立项的处理效率;
在1G的堆内存,处理百万级以下的数据量,还是可以滴。
分页分批次处理:
java opts:
-server
-Xms1024M
-Xmx1536M
-XX:NewSize=512M
-XX:ParallelGCThreads=4
主要逻辑:
在InsertRecordByPages函数中,不用的局部变量要null化
结果:可以处理140万的数据
==============第15页start==========
2016-09-30 16:16:10 -885050 ==============已更新记录数:1409864
2016-09-30 16:16:10 -885050 ==============第15页end==========
再大,只能用工具迁移了。
堆内存设置原理:http://blog.csdn.net/sivyer123/article/details/17139443/
JVM 之 GC日志分析 :http://blog.csdn.net/lan861698789/article/details/51985188
JVM client模式和Server模式的区别:http://developer.51cto.com/art/201009/228035.htm
垃圾收集器:http://yueyemaitian.iteye.com/blog/1185301
VisualVM分析器:http://www.cnblogs.com/linghu-java/p/5689227.html
MemoryAnalyzer使用:http://wensong.iteye.com/blog/1986449
MAT中Retained和Shallow区别:http://bjyzxxds.iteye.com/blog/1532937
应用场景:先需要将Mdb中的表中数据,全量迁移到Sdb中,一种方法用工具Kettle,第二种编写脚本,第三种程序迁移,第一与第二种迁移对大表没有问题,第三种,由于百万级数据表,全量从Mdb取出,再全量插入的Sdb,对内存的要求较高,比较有效的方法是分页查询,再插入;今天我们不讲的分页查询插入,来看全量从Mdb取出,再分批量插入的Sdb,关于分页分批插入(为应对内存问题,可以将查询结果存到文件,再从文件中读取插入),后续再讲。
主要代码:
int counts =0;//记录数 //Data d = null; while (rs.next()) { Data d = new Data(); d = getData(rs); insertList.add(d); pd = null;//待gc回收 if(counts%5000==0){ batchSave(insert, insertList); insertList.clear(); log.info("============RecordsSave:"+counts); } if(rs.isLast()){ batchSave(insert, insertList); insertList.clear(); } log.info("============Records:"+counts); counts++; }
下面的测试表记录数为28万
Tomcat:JavaOPT 默认
-client
-Xmx256M
JVM虚拟机默认启动时,client模式,垃圾模式为Serial New + Serial Old
当counts%10000==0,批量为10000,抛出OOM:java heap space
当Data d = new Data();放在循环外定义:Data d = null;抛出OOM:java heap space
当批量为5000时:
JConsole 堆信息:
2016-09-29 16:40:42
已使用: 107,876 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(326 项收集)所用的时间为 2.518 秒
MarkSweepCompact(171 项收集)所用的时间为 1 minute
所用时间s:220.66
VisualVM:
Viusal GC:
去除log.info("============Records:"+counts);
JConsole 堆信息:
时间: 2016-09-29 16:25:44
已使用: 244,748 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(332 项收集)所用的时间为 2.456 秒
MarkSweepCompact(114 项收集)所用的时间为 39.902 秒
所用时间s:163.09
这说明,不要打,不必要的log
VisualVM:
Viusal GC:
当批量为2000时:
JConsole 堆信息:
2000
时间: 2016-09-29 16:50:28
已使用: 252,652 Kb
分配: 253,440 Kb
最大值: 253,440 Kb
GC 时间:
Copy(321 项收集)所用的时间为 2.369 秒
MarkSweepCompact(106 项收集)所用的时间为 36.438 秒
所用时间s:145.524
VisualVM:
Viusal GC:
对比5000可以看出,堆内存的趋势图,更平缓,Copy及MarkSweepCompact收集次数减少,故所用时间降低。
当批量为1000时:
JConsole 堆信息:
时间: 2016-09-29 17:03:10
已使用: 249,215 Kb
分配: 253,440 Kb
最大值:253,440 Kb
GC 时间:
Copy(330 项收集)所用的时间为 2.299 秒
MarkSweepCompact(100 项收集)所用的时间为 34.530 秒
所用时间s:159.459
从所用时间和Copy及来看,比2000批次还有,MarkSweepCompact收集次数减少了6次
从5000,2000,1000来看说明,批次处理量对处理的速度有影响,应选择合适的批次数量。
下面调整一下
JavaOPT
-server
-XX:+PrintGCDetails
-Xloggc:E:\gc.log
Server模式下,垃圾回收器默认为PS Scavenge+ PS-Old
我的机器内存是8G,默认Server模式下,Xmx1024M ,同样的处理逻辑:
当批量为2000时:
JConsole 堆信息:
时间: 2016-09-29 17:12:41
已使用: 337,969 Kb
分配: 574,784 Kb
最大值: 932,096 Kb
GC 时间:
PS MarkSweep(6 项收集)所用的时间为 1.475 秒
PS Scavenge(74 项收集)所用的时间为 1.090 秒
全量更新所用时间s:114.25
当批量为5000时:
时间: 2016-09-29 17:19:26
已使用: 365,969 Kb
分配: 547,968 Kb
最大值: 932,096 Kb
GC 时间:
PS MarkSweep(6 项收集)所用的时间为 1.400 秒
PS Scavenge(70 项收集)所用的时间为 1.212 秒
所用时间s:107.12
从上可以看出新生代的收集次数减少,所用时间减少,这说明当堆内存增大时,可以相应的调整批量处理数,以提高处理效率。
我们来看看在-server,模式下能处理的最大记录数:
java OPTS:
-server
-Xms512M
-Xmx1024M
-XX:NewSize=384M
-XX:ParallelGCThreads=4
-XX:+PrintGCDetails
-Xloggc:E:\gc.log
时间: 2016-09-29 18:16:19
已使用: 1,004,657 Kb
分配: 1,028,288 Kb
最大值: 1,028,288 Kb
GC 时间:
PS MarkSweep(424 项收集)所用的时间为 10 minutes
PS Scavenge(121 项收集)所用的时间为 3.631 秒
在上述配置下,能够处理的最大记录数为1040000
总结:
从上的分析来看,批量处理的数量,应该根据堆内存的变化而调整,已达到立项的处理效率;
在1G的堆内存,处理百万级以下的数据量,还是可以滴。
分页分批次处理:
java opts:
-server
-Xms1024M
-Xmx1536M
-XX:NewSize=512M
-XX:ParallelGCThreads=4
主要逻辑:
sql = "SELECT COUNT(*) FROM " + test; ps = con.prepareStatement(sql); countResultSet = ps.executeQuery(); int sums =0; while(countResultSet.next()){ sums =countResultSet.getInt(1); } int batches = 0; if( sums > 100000){ if(sums % 100000 ==0){ batches = sums/100000; } else{ batches = sums/100000 + 1; } } int counts =0;//记录数 for(int i =1;i<=batches;i++){ logger.info("==============第"+i+"页start=========="); counts+=InsertRecordByPages((i-1)*100000+1,(i)*100000); logger.info("==============已更新记录数:"+counts); logger.info("==============第"+i+"页end=========="); }
在InsertRecordByPages函数中,不用的局部变量要null化
结果:可以处理140万的数据
==============第15页start==========
2016-09-30 16:16:10 -885050 ==============已更新记录数:1409864
2016-09-30 16:16:10 -885050 ==============第15页end==========
再大,只能用工具迁移了。
发表评论
-
Deadlock found when trying to get lock; try restarting transaction解决方式
2017-07-18 23:00 1973MySQL 事务的学习整理:http://blog.csdn. ... -
MySQL慢日志
2017-05-18 16:05 995The Slow Query Log:https://dev. ... -
The table is full问题解决过程
2017-05-06 15:29 7279The table‘xxxx’is full 设置临时表大小 ... -
百万级数据-程序迁移后续
2017-04-13 18:09 1587百万级数据-程序迁移:http://donald-draper ... -
Msyql日期字符串转换
2017-04-01 14:13 500Date和String的互相转换:http://www.tui ... -
Mysql添加约束
2017-03-31 16:28 860MySQL中对三种约束的支持:http://leekai.me ... -
Mysql FEDERATED引擎
2016-11-29 15:51 571使用mysql federated引擎构建MySQL分布式数据 ... -
MySQL触发器
2016-11-24 19:04 675CHANGE MASTER:http://dev.mysql. ... -
Mysql主从配置
2016-11-11 18:31 4891、主从服务器分别作以下操作: 1)版本一致 2)初始 ... -
Mysql 备份工具XtraBackup增量备份
2016-08-05 18:11 687安装:http://donald-draper.iteye.c ... -
Mysql 备份工具XtraBackup全量备份
2016-08-05 16:41 522Percona安装:http://donald-draper. ... -
Mysql 备份工具XtraBackup 安装
2016-08-05 16:28 906开源热备工具XtraBackup下载:https://www. ... -
sysbench基准测试
2016-08-01 17:45 725下载sysbench:http://dev.mysql.com ... -
mysql 事务处理
2016-07-29 16:07 481创建表: CREATE TABLE `role` ( ` ... -
mysql 全文索引
2016-07-28 11:03 576mysql大表查询的时候,'String%'模糊查询可以使用B ... -
MySQL 物理文件的迁移
2016-07-26 15:39 2281参考资料:http://www.cnblogs.com/adv ... -
centos7 安装mysql
2016-07-26 11:36 710下载MYSQL-RPM包:http://downloads.m ... -
mysql 大表添加索引注意事项
2016-07-25 16:01 2586LINXU top命令: http://www.c ... -
mysql 大表分页查询测试分析优化
2016-07-25 11:30 1464索引概念: http://blog.csdn.net/xlur ... -
MySQL事务
2016-06-01 10:49 577事务基础知识:http://my.oschina.net/je ...
相关推荐
现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库类型 如:(orcal,sqlServer,csv 迁移至mysql) 2.在迁移数据库时,可以只迁移指定字段. 3.开发多任务的平台,按权重去执行任务,如:...
Oracle导Mysql适用于百、千万级别数据迁移,速度是kettle的10倍以上数据库迁移 数据迁移 千万级 亿万级数据,MySQL oracle关系型 现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库...
跨库数据迁移—基于NewLife.XCode开发的支持任意数据进行数据之间的迁移和同步工具源码+项目说明.7z 跨库数据迁移—基于NewLife.XCode开发的支持任意数据进行数据之间的迁移和同步工具源码+项目说明.7z 跨库数据迁移...
将数据库1的表A迁移到数据库2的表B里面,自己配置数据库,和表的数据库信息和字段信息就可以了!很简单
基于PHP的KISETL 开源轻量级数据迁移程序 php版.zip
基于PHP的KISETL开源轻量级数据迁移程序php版源码.zip
PHP实例开发源码—KISETL 开源轻量级数据迁移程序 php版.zip
采用jdbc连接数据库,将两种不同类型的数据(SqlServer、Oracle)进行转换,来完成数据库数据的迁移。 实现方式,查询SqlServer数据,批处理插入到Oracle中。
KISETL数据迁移程序.7z
特点: 1、程序简单,由PHP编写,用Excell做迁移配置。 2、目前支持mysql, sqlite,Excell三种数据源 3、操作方便,在php的环境中执行,由dos shell启动 4、配置灵活,适合处理10万以下的小批量数据
主要内容包括数据仓库的设计与建造步骤,传统系统到数据仓库的迁移,数据仓库的数据粒度、数据分割、元数据管理、外部数据与非结构化数据,分布式数据仓库、高级管理人员信息系统和数据仓库的设计评审等。...
易我电脑迁移软件是一款可以帮助您提高工作效率的数据传输工具,如果您更换了新电脑,就可以使用该软件将旧电脑的应用程序和文件迁移到新电脑,同时旧电脑上的用户设置、账户等也会传输到新电脑,无须重新设置。...
用户可以使用本程序提供的灵活的字符图形界面(绝对免安装)在UNIX字符终端或TELNET界面上对ORACLE数据库进行灵动的数据导出和加载, 同时集成了最高效的ORACLE数据导入导出模块,可大幅度提高日常数据备份和一次性...
迁移过程中失败任务数低于5%,大部分对象和数据都能够保证正常迁移。其中对于出错的任务,主要有导表和导函数包两部分。其中主要棘手的在与迁移函数包等对象时的问题。 2、迁移错误详解 2.1、通用问题 说明:对于...
PB的数据管道技术,并通过一个具体的实例说明在应用程序进行数据传输
基于某某系统平台的数据源迁移 1 一、背景 4 二、环境准备 4 1、软件 4 2、jar包 4 3、web应用 4 三、mysql数据库的安装 4 四、数据库的创建并用客户端软件连接 5 1、创建数据库 5 2、应用 navicat连接mysql 数据库 ...
Laplink PCmover Enterprise 是一款鼻祖级的电脑数据迁移软件,开创了新旧电脑之间文件迁移软件的先河,提供了最简单高效同时又安全可靠的数据迁移方法,据说是唯一一款可将包括音视频、图片、文档以及应用程序在内...
外连接在PL/SQL数据迁移程序中的应用.pdf
Java数据库备份迁移程序的源代码.
本程序用于数据库的异表数据导入,将一张表中的数据导入到另外一张不同的表中。方便实用。