Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于导入excel工作表并将其存储到servlet中的DB中的高效程序_Java_Mysql_Jsp_Excel Import - Fatal编程技术网

Java 用于导入excel工作表并将其存储到servlet中的DB中的高效程序

Java 用于导入excel工作表并将其存储到servlet中的DB中的高效程序,java,mysql,jsp,excel-import,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

我已经编写了一个代码来导入.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();
  }
}
sql=new-StringBuffer(“插入到bookdetails(bookno));
对于(inti=0;i
我可以采取哪些措施加快存储速度。
我是否可以暂时一次性存储.xls工作表,而不是逐行存储(这需要很多时间)。
欢迎提出任何建议

在每次
addBatch
之后,您都在执行
executeBatch
。最后执行批处理。 最好不要成批处理数千个,所以下面我会成批处理100个(内存使用更少,驱动程序的数据传输也更少)

int batchSize=0;
对于(int i=1;i=100){
batchSize=0;
psmt.executeBatch();
psmt.clearBatch();
}
//获取单个行
自动的=
获取自动增量(
骗局
“bookdetails”);//getAutoIncrement()只是增加值(顾名思义)。
psmt设置管柱(1,自动);
//s是床单
if(s.getCell(0,0).getContents().length()!=0){
对于(int j=0;j

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

很难用当前缩进看到:您是否正在为每一行执行插入?如果是这样的话,也许可以在同一个insert中放入许多行。最快的解决方案可能是a)扔掉Java代码,b)编写VBA宏以将Excel数据导出为一组SQL“insert”语句,然后c)直接从数据库执行SQL脚本。另一种“更快”的方法可能是,如果您可以从Excel直接连接到数据库。如果您的数据库恰好是MSSQL,则是另一个替代的.My appologies for the indentation@AndyTurner。我试图纠正它,使它更可读。你做批处理错误。您执行
addBatch()
,然后立即执行
executeBatch()
。您应该执行
N
addBatch()
,然后执行
executeBatch()
。您可以忽略服务器准备的语句,因为它只与大量行(数万行)相关,但它显示了如何执行添加/执行。这里还有很多其他的批处理问题,向您展示如何完成。
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
}