Java 使用EasyExcel批量导入excle数据到Oracle数据库

谁借莪1个温暖的怀抱¢ 2023-06-21 15:26 106阅读 0赞

1、读取excel数据,插入Oracle数据库。

2、使用数据100万条。

  1. 测试100万条数据的插入Oracle数据库
  2. 批处理条数 时间
  3. 2500 50466毫秒
  4. 2500 59945毫秒
  5. 2500 55605毫秒
  6. 2000 51228毫秒
  7. 2000 57499毫秒
  8. 3000 52740毫秒
  9. 5000 53282毫秒
  10. 读取文件开始
  11. sql开始
  12. sql结束,使用时间:15627毫秒
  13. excelsheet长度:1000000
  14. 读取文件并执行sql结束,使用时间:62094毫秒
  15. 读取文件开始
  16. sql开始
  17. sql结束,使用时间:12030毫秒
  18. excelsheet长度:1000000
  19. 读取文件并执行sql结束,使用时间:60083毫秒

总结:发现读取excel花费的时间才是最多了。

100万条数据插入数据库时间大概15秒左右。50秒时间读取数据。总共60秒。

1、

  1. @Test
  2. public void saxReadJavaModelV2007_test() throws IOException {
  3. System.out.println("读取文件开始");
  4. long start = System.currentTimeMillis();
  5. InputStream inputStream = new FileInputStream(new File("D:\\aaa\\abc_2007.xlsx"));
  6. ExcelListenerTest excelListener = new ExcelListenerTest();
  7. EasyExcelFactory.readBySax(inputStream, new Sheet(1, 1, BillReadModelTest.class), excelListener);
  8. inputStream.close();
  9. long stop = System.currentTimeMillis();
  10. System.out.println("读取文件并执行sql结束,使用时间:"+(stop-start)+"毫秒");
  11. }

2、

  1. import cn.com.JdbcUtil.JDBCUtil;
  2. import cn.com.model.BillReadModelTest;
  3. import com.alibaba.excel.context.AnalysisContext;
  4. import com.alibaba.excel.event.AnalysisEventListener;
  5. import java.sql.Connection;
  6. import java.sql.PreparedStatement;
  7. import java.sql.SQLException;
  8. import java.sql.Timestamp;
  9. import java.util.ArrayList;
  10. import java.util.List;
  11. public class ExcelListenerTest extends AnalysisEventListener {
  12. private static Connection conn = JDBCUtil.getConnection();
  13. private static final int initialCapacity = 1000000;
  14. private List<BillReadModelTest> data = new ArrayList<>(initialCapacity);
  15. @Override
  16. public void invoke(Object object, AnalysisContext context) {
  17. data.add((BillReadModelTest) object);
  18. //方式1:当读取到initialCapacity条数据的时候,插入一次数据库,清空list
  19. // if(data.size() >= initialCapacity){
  20. // doSomethingForTwo();
  21. // data = new ArrayList<>(initialCapacity);
  22. // }
  23. //方式2:把所有的excel数据全部读取到内存中,最后批量插入数据库
  24. }
  25. @Override
  26. public void doAfterAllAnalysed(AnalysisContext context) {
  27. //解析结束销毁不用的资源
  28. //注意不要调用datas.clear(),否则getDatas为null
  29. //方式1:把剩下的插入数据库
  30. // doSomethingForTwo();
  31. //方式2:把所有的excel数据全部读取到内存中,最后批量插入数据库
  32. System.out.println("sql开始");
  33. long start = System.currentTimeMillis();
  34. doSomethingForOne();
  35. long stop = System.currentTimeMillis();
  36. System.out.println("sql结束,使用时间:"+(stop-start)+"毫秒");
  37. System.out.println("excel的sheet长度:"+data.size());
  38. }
  39. public void doSomethingForOne(){
  40. PreparedStatement ps = null;
  41. try {
  42. //关闭自动提交,即开启事务
  43. conn.setAutoCommit(false);
  44. } catch (SQLException e) {
  45. e.printStackTrace();
  46. }
  47. String sql = " insert into testimport(a,b,c,d,e,f,g,h,i,j) values (?,?,?,?,?,?,?,?,?,?) ";
  48. //设置批量处理的数量
  49. int batchSize = 2500;
  50. try {
  51. //创建语句对象
  52. ps = conn.prepareStatement(sql);
  53. for(int i = 0; i < data.size(); i++){
  54. BillReadModelTest md = data.get(i);
  55. ps.setString(1,md.getBillno());
  56. ps.setString(2,md.getA());
  57. ps.setString(3,md.getB());
  58. ps.setString(4,md.getC());
  59. ps.setString(5,md.getD());
  60. ps.setString(6,md.getE());
  61. ps.setString(7,md.getF());
  62. ps.setString(8,md.getG());
  63. ps.setString(9,md.getH());
  64. ps.setTimestamp(10,new Timestamp(md.getI().getTime()));
  65. ps.addBatch();
  66. // 当数据满100条批量插入
  67. if (i > 0 && i % batchSize == 0 ) {
  68. // 语句执行完毕,提交本事务
  69. ps.executeBatch();
  70. ps.clearBatch();
  71. // 此处的事务回滚是必须的
  72. try {
  73. conn.commit();
  74. } catch (Exception e) {
  75. conn.rollback();
  76. }
  77. }
  78. }
  79. // 如果数据不为倍数的话,最后一次会剩下一些
  80. // 语句执行完毕,提交本事务
  81. ps.executeBatch();
  82. ps.clearBatch();
  83. try {
  84. conn.commit();
  85. } catch (Exception e) {
  86. conn.rollback();
  87. }
  88. // 在把自动提交打开
  89. conn.setAutoCommit(true);
  90. }catch (SQLException e) {
  91. e.printStackTrace();
  92. }finally {
  93. JDBCUtil.closeResource(null,ps,null);
  94. }
  95. }
  96. public void doSomethingForTwo() {
  97. PreparedStatement ps = null;
  98. try {
  99. //关闭自动提交,即开启事务
  100. conn.setAutoCommit(false);
  101. } catch (SQLException e) {
  102. e.printStackTrace();
  103. }
  104. String sql = " insert into testimport(a,b,c,d,e,f,g,h,i,j) values (?,?,?,?,?,?,?,?,?,?) ";
  105. try {
  106. //创建语句对象
  107. ps = conn.prepareStatement(sql);
  108. for(int i = 0; i < data.size(); i++){
  109. BillReadModelTest md = data.get(i);
  110. ps.setString(1,md.getBillno());
  111. ps.setString(2,md.getA());
  112. ps.setString(3,md.getB());
  113. ps.setString(4,md.getC());
  114. ps.setString(5,md.getD());
  115. ps.setString(6,md.getE());
  116. ps.setString(7,md.getF());
  117. ps.setString(8,md.getG());
  118. ps.setString(9,md.getH());
  119. ps.setTimestamp(10,new Timestamp(md.getI().getTime()));
  120. ps.addBatch();
  121. }
  122. // 如果数据不为倍数的话,最后一次会剩下一些
  123. // 语句执行完毕,提交本事务
  124. ps.executeBatch();
  125. try {
  126. conn.commit();
  127. } catch (Exception e) {
  128. conn.rollback();
  129. }
  130. // 在把自动提交打开
  131. conn.setAutoCommit(true);
  132. }catch (SQLException e) {
  133. e.printStackTrace();
  134. }finally {
  135. JDBCUtil.closeResource(null,ps,null);
  136. }
  137. }
  138. }

3、

  1. import com.alibaba.excel.annotation.ExcelProperty;
  2. import com.alibaba.excel.metadata.BaseRowModel;
  3. import java.util.Date;
  4. public class BillReadModelTest extends BaseRowModel {
  5. @ExcelProperty(index = 0)
  6. private String billno;
  7. @ExcelProperty(index = 1)
  8. private String a;
  9. // 省略字段get, set方法

}

发表评论

表情:
评论列表 (有 0 条评论,106人围观)

还没有评论,来说两句吧...

相关阅读