java 跨数据库导入大数据


  1. /**
  2. * java程序跨服务器跨数据库批量导入导出百万级数据
  3. * @param args
  4. * @throws Exception
  5. */
  6. public static void main(String args[]) throws Exception {
  7. ResultSet rs = null;
  8. Statement s1 = null;
  9. Statement s2 = null;
  10. Connection cn1 = null;
  11. Connection cn2 = null;
  12. long startTime = 0;// 开始时间
  13. long endTime = 0; // 结束时间
  14. int count = 1; // 计数
  15. int onerun = 0; // 执行的最大数
  16. int datanum = 0; // 总条数
  17. int num = 0; // 取整最大数据
  18. try {
  19. startTime = System.currentTimeMillis();
  20. Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
  21. Class.forName("oracle.jdbc.driver.OracleDriver");
  22. cn1 = DriverManager.getConnection("jdbc:oracle:thin:@192.168.1.16:1521:oracleDb", "test", "test2012");
  23. cn2 = DriverManager.getConnection("jdbc:sqlserver://192.168.1.18:1433;databaseName=dbsql;user=sa;password=db2012");
  24. // 插入oracle数据库时使用事务批量提交
  25. cn1.setAutoCommit(false);
  26. if (cn2 != null) {
  27. //ORACLE 数据库
  28. s1 = cn1.createStatement();
  29. //sqlserver 数据库
  30. s2 = cn2.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
  31. // 先查询sqlserver数据源表,获取总数据条数
  32. rs = s2.executeQuery("select count(vcBusiFlowNo) from tb_His2_Ask_Pay_Fee");
  33. if (rs.next()) {
  34. datanum = rs.getInt(1);
  35. }
  36. System.out.println("总记录数:" + datanum + "条");
  37. onerun = 10000;// 执行的最大数
  38. // 计算出总条数符合每批10000的数量是多少
  39. num = datanum / onerun * onerun;
  40. s2.setMaxRows(datanum);
  41. s2.setFetchSize(onerun);// 每批执行的数据条数
  42. //查询
  43. rs = s2.executeQuery(
  44. "select nSerialNo,vcBusiFlowNo,vcBusiTypeID,vcBusiNumber,vcUserName,vcUserAddress,vcUserLinkTel,nPayFee,vcBusiMonth,vcComments,dOperDate,vcOperID,vcDealerID,vcAreaCode,vcDealerGradeID from tb_His2_Ask_Pay_Fee");
  45. while (rs.next()) {
  46. //边查询变插入
  47. s1.addBatch(
  48. "insert into tb_His2_Ask_Pay_Fee(nSerialNo,vcBusiFlowNo,vcBusiTypeID,vcBusiNumber,vcUserName,vcUserAddress,vcUserLinkTel,nPayFee,vcBusiMonth,vcComments,dOperDate,vcOperID,vcDealerID,vcAreaCode,vcDealerGradeID) values('"
  49. + rs.getString("nSerialNo") + "','" + rs.getString("vcBusiFlowNo") + "','"
  50. + rs.getString("vcBusiTypeID") + "','" + rs.getString("vcBusiNumber") + "','"
  51. + rs.getString("vcUserName") + "','" + rs.getString("vcUserAddress") + "','"
  52. + rs.getString("vcUserLinkTel") + "','" + rs.getString("nPayFee") + "','"
  53. + rs.getString("vcBusiMonth") + "','" + rs.getString("vcComments") + "','"
  54. + rs.getString("dOperDate") + "','" + rs.getString("vcOperID") + "','"
  55. + rs.getString("vcDealerID") + "','" + rs.getString("vcAreaCode") + "','"
  56. + rs.getString("vcDealerGradeID") + "')");
  57. // 10000取整后剩余的小数据量就顺序插入
  58. if (count > num) {
  59. //批量执行
  60. s1.executeBatch();
  61. //提交事务
  62. cn1.commit();
  63. //清空
  64. s1.clearBatch();
  65. } else {
  66. // 数据够批次的就按批量插入
  67. if (count % onerun == 0) {
  68. // 10000条一批插入
  69. s1.executeBatch();
  70. cn1.commit();
  71. s1.clearBatch();
  72. }
  73. }
  74. count++;
  75. }
  76. }
  77. } catch (Exception e) {
  78. e.printStackTrace();
  79. } finally {
  80. rs.close();
  81. s2.close();
  82. s1.close();
  83. cn2.close();
  84. cn1.close();
  85. }
  86. endTime = System.currentTimeMillis();
  87. System.out.println("成功移植数据:" + (count - 1) + "条,耗时" + (endTime - startTime) / 1000 + "秒");
  88. }

java 跨数据库导入大数据的更多相关文章

  1. MYSQL数据库导入大数据量sql文件失败的解决方案

    1.在讨论这个问题之前首先介绍一下什么是"大数据量sql文件". 导出sql文件.选择数据库-----右击选择"转储SQL文件"-----选择"结构和 ...

  2. Sqlserver 2005 跨数据库 导入数据

    --Sqlserver 2005 跨数据库 导入数据:--SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/O ...

  3. SQL跨数据库复制表数据

    SQL跨数据库复制表数据   不同服务器数据库之间的数据操作 不同数据库之间复制表的数据的方法: 当表目标表存在时: insert into 目的数据库..表 select * from 源数据库.. ...

  4. sqlcmd导入大数据文件

    sqlcmd导入大数据文件 SQLCMD 允许在Windows命令窗中通过命令行提示符运行脚本. 语法如下: sqlcmd  [  { { -U <login id> [ -P <p ...

  5. c#几种数据库的大数据批量插入(SqlServer、Oracle、SQLite和MySql)

    这篇文章主要介绍了c#几种数据库的大数据批量插入(SqlServer.Oracle.SQLite和MySql),需要的朋友可以了解一下. 在之前只知道SqlServer支持数据批量插入,殊不知道Ora ...

  6. 黑马基础阶段测试题:创建一个存储字符串的集合list,向list中添加以下字符串:”C++”、”Java”、” Python”、”大数据与云计算”。遍历集合,将长度小于5的字符串从集合中删除,删除成功后,打印集合中的所有元素

    package com.swift; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; ...

  7. Java数据库——处理大数据对象

    处理大数据对象 CLOB中可以存储海量文字 BLOB中可以存储海量二进制数据 如果程序中要想处理这样的大对象操作,则必须使用PreparedStatement完成,所有的内容要通过IO流的方式从大文本 ...

  8. MySQL数据库解决大数据量存储问题

    转载自:https://www.cnblogs.com/ryanzheng/p/8334915.html 提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如 ...

  9. Eclipse中java向数据库中添加数据,更新数据,删除数据

    前面详细写过如何连接数据库的具体操作,下面介绍向数据库中添加数据. 注意事项:如果参考下面代码,需要 改包名,数据库名,数据库账号,密码,和数据表(数据表里面的信息) package com.ning ...

随机推荐

  1. 通信协议之广播---recvfrom 放回客户端的ip地址第一次全为0.0.0.0

    遇到一个很恶心的问题. while(1) { recvfrom(sockfd, readbuff, UDP_CMD_BUFF_LENGTH - 1, 0, (struct sockaddr *)&am ...

  2. mongodb性能问题及原理分析

    近期忙着把一个项目从MySQL迁移到MongoDB,在导入旧数据的过程中.遇到了些许波折,犯了不少错误,但同一时候也学到了不少知识,遂记录下来. 公司为这个项目专门配备了几台高性能务器,清一色的双路四 ...

  3. CentOS系统bash: groupadd: command not found问题

    如果我们需要在CentOS执行新建用户组命令的时候,需要进入到ROOT权限,如果你用以下命令: 1 su2 su root 进入到ROOT账户,那么会出现上述的错误信息:“bash: groupadd ...

  4. 【BZOJ4724】[POI2017]Podzielno 数学+二分

    [BZOJ4724][POI2017]Podzielno Description B进制数,每个数字i(i=0,1,...,B-1)有a[i]个.你要用这些数字组成一个最大的B进制数X(不能有前导零, ...

  5. SpringBoot-------实现多数据源Demo

    之前SpringBoot出来时候就看了下Springboot,感觉的确精简掉了配置文件! 还是很方便的!没办法,我只是个菜鸟! 什么怎么启动Springboot什么的就不说了, 具体的Demo地址我都 ...

  6. Webshell清除-解决驱动级文件隐藏挂马

    Webshell清除-解决驱动级文件隐藏挂马

  7. Java基础 - 函数与方法

    java 是一门面向对象编程,其它语言中的函数也就是java中的方法 方法的基本使用方法 package com.demo7; /* * 函数/方法 * * 定义格式: * 修饰符 返回值类型 方法名 ...

  8. Connection cannot be null when 'hibernate.dialect' not set

    严重: Exception sending context initialized event to listener instance of class [org.springframework.w ...

  9. log日志框架和LocationAwareLogger问题

    遇到了同样的问题, 我的解决办法是在pom.xml中增加如下配置,去除对于jcl-over-slf4j.jar的依赖. <exclusions>                <ex ...

  10. Wireshark网络分析工具(二)

    一.TCP三次握手过称 1. 第一次握手的数据包 客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接. 如下图: 2. 第二次握手的数据包 服务器发回确认包, 标志位为 SYN ...