java - 用于导入 Excel 工作表然后将其存储到 servlet 中的数据库中的省时程序

标签 java mysql jsp excel-import

我编写了一段代码来导入.xls并将数据存储到数据库中。它适用于少量数据,即数百行 Excel。但如果 .xls 有 5000 行,则导入和存储大约需要 1.5 - 2 分钟。 这是一段代码:

sql = new StringBuffer("insert into bookdetails(bookno");
for (int i = 0; i < header.length; i++) sql.append("," + header[i]);

sql.append(") values(?");
for (int i = 0; i < header.length; i++) sql.append(",?");

sql.append(")");
System.out.println(sql);
psmt = con.prepareStatement(sql.toString());

columnCount = s.getColumns();

// Reading Individual Row Content
for (int i = 1; i < rowCount; i++) {
  // Get Individual Row

  auto =
      getAutoIncrement(
          con,
          "bookdetails"); // getAutoIncrement() just increments the value(as the name suggests).
  psmt.setString(1, auto);

  // s is sheet
  if (s.getCell(0, 0).getContents().length() != 0) {
    for (int j = 0; j < columnCount; j++) {
      rowData = s.getCell(j, i).getContents();

      System.out.println(
          "Header====" + header[j] + "==rowData[j]==" + rowData + "==i==" + i + "==j==" + j);
      // let's say our excel has 4 columns[sno, hello, asd, column]
      if (header[j].equalsIgnoreCase("sno")) {
        psmt.setString(2, rowData);
      } else if (header[j].equalsIgnoreCase("hello")) {
        psmt.setString(3, rowData);
      } else if (header[j].equalsIgnoreCase("asd")) {
        psmt.setString(4, rowData);
      } else if (header[j].equalsIgnoreCase("column")) {
        psmt.setString(5, rowData);
      }
    }
    psmt.addBatch();
    psmt.executeBatch();
  }
}

我可以采取什么措施来加快存储速度。
我可以暂时存储 .xls 工作表,而不是逐行存储(这会花费很多时间)吗? 欢迎任何建议。

最佳答案

您在每个 addBatch 之后执行一个 executeBatch。最后执行批处理。 最好不要进行数千个批处理,因此下面我会进行 100 个批处理(较少的内存使用量和驱动程序的较轻数据传输)。

int batchSize = 0;

for (int i = 1; i < rowCount; i++) {
  if (batchSize >= 100) {
      batchSize = 0;
      psmt.executeBatch();
      psmt.clearBatch();
  }

  // Get Individual Row

  auto =
      getAutoIncrement(
          con,
          "bookdetails"); // getAutoIncrement() just increments the value(as the name suggests).
  psmt.setString(1, auto);

  // s is sheet
  if (s.getCell(0, 0).getContents().length() != 0) {
    for (int j = 0; j < columnCount; j++) {
      rowData = s.getCell(j, i).getContents();

      System.out.println(
          "Header====" + header[j] + "==rowData[j]==" + rowData + "==i==" + i + "==j==" + j);
      // let's say our excel has 4 columns[sno, hello, asd, column]
      if (header[j].equalsIgnoreCase("sno")) {
        psmt.setString(2, rowData);
      } else if (header[j].equalsIgnoreCase("hello")) {
        psmt.setString(3, rowData);
      } else if (header[j].equalsIgnoreCase("asd")) {
        psmt.setString(4, rowData);
      } else if (header[j].equalsIgnoreCase("column")) {
        psmt.setString(5, rowData);
      }
    }
    psmt.addBatch();
  }
  psmt.executeBatch(); // At the end.
  psmt.close(); // Close
}

不相关,但您应该使用 StringBuilder i.o.旧的、速度较慢的StringBuffer

关于java - 用于导入 Excel 工作表然后将其存储到 servlet 中的数据库中的省时程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59641127/

相关文章:

java - commons-net-3.2 :mismatch between timestamp and timezone

java - Java 冰雹程序

mysql - "CONCAT"生成的列未显示在数据库表中

mysql - 想知道sql语句是否正确

java - 刷新按钮禁用

java - 从 jsp 页面接收 'null' 值到 Struts2 Action

java - PMD的 “Must Follow”规则有哪些?

java - 两个 Java 应用程序如何在 EC2 上的两个实例上进行通信?

php - Openshift:PHP 中未设置数据库环境变量

java - JSP代码的复用