Java 用于导入excel工作表并将其存储到servlet中的DB中的高效程序
我已经编写了一个代码来导入.xls并将数据存储到数据库中。它适用于少量数据,即数百行excel。但是如果.xls有5000行,导入和存储大约需要1.5-2分钟。 下面是一段代码: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
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
}