我写的代码大约需要3分钟才能获得3000行的文件。但这对我的代码来说太长了。任何人都可以指导我做错了什么?
while((newl=bfr.readLine())!=null)
{
newl.trim();
String entries[]=newl.split(",");
String date=entries[0];
float open=Float.parseFloat(entries[1]);
float high=Float.parseFloat(entries[2]);
float low=Float.parseFloat(entries[3]);
float close=Float.parseFloat(entries[4]);
int volume=Integer.parseInt(entries[5]);
float adjclose=Float.parseFloat(entries[6]);
float amt_change=close-open;
float percent_change=(amt_change/open)*100;
PreparedStatement ps=con.prepareStatement("INSERT INTO "+sname+" VALUES (?,?,?,?,?,?,?,?,?)");
ps.setString(1, date);
ps.setFloat(2, open);
ps.setFloat(3, high);
ps.setFloat(4, low);
ps.setFloat(5, close);
ps.setInt(6, volume);
ps.setFloat(7, adjclose);
ps.setFloat(8, amt_change);
ps.setFloat(9, percent_change);
ps.executeUpdate();
}
此代码采用文本格式的文件,用逗号分隔并将其输入到mysql数据库中。这些条目::
2005-04-01,1215.00,1275.00,1203.00,1263.85,189900,1239.52
2005-03-31,1218.00,1235.25,1201.00,1212.60,106000,1189.26
2005-03-30,1188.00,1232.00,1174.00,1210.05,173800,1186.76
2005-03-29,1208.00,1209.95,1168.35,1184.85,196300,1162.04
2005-03-28,1210.00,1224.45,1203.00,1209.30,167500,1186.02
我想尽可能减少时间,而且我是初学者。请帮忙。
答案 0 :(得分:0)
您可以将PreparedStatement
移到for循环之外。
所以语句只会“准备”一次(这意味着你的sql只解析了一个)并在循环中执行了n次。
另外禁用autocommit
并提交每n个插入。
con.setAutocommit(false);
PreparedStatement ps=con.prepareStatement("INSERT INTO "+sname+" VALUES (?,?,?,?,?,?,?,?,?)");
int counter = 0;
while((newl=bfr.readLine())!=null)
{
newl.trim();
String entries[]=newl.split(",");
String date=entries[0];
float open=Float.parseFloat(entries[1]);
float high=Float.parseFloat(entries[2]);
float low=Float.parseFloat(entries[3]);
float close=Float.parseFloat(entries[4]);
int volume=Integer.parseInt(entries[5]);
float adjclose=Float.parseFloat(entries[6]);
float amt_change=close-open;
float percent_change=(amt_change/open)*100;
ps.setString(1, date);
ps.setFloat(2, open);
ps.setFloat(3, high);
ps.setFloat(4, low);
ps.setFloat(5, close);
ps.setInt(6, volume);
ps.setFloat(7, adjclose);
ps.setFloat(8, amt_change);
ps.setFloat(9, percent_change);
ps.executeUpdate();
counter++;
// Try with values different of 1000 to check the best commit size.
// It depends from the database, the hardware, the record size
if (counter % 1000 == 0) {
conn.commit();
}
}
conn.commit(); // Remember to add a final commit
另外,我看到你正在阅读一个文件。检查是否使用了缓冲版本的输入流。您将使用Buffered stream
获得一些额外的性能答案 1 :(得分:0)
上面的代码应该在一个事务中发生所有事情,因此db commit最后一次。但您可以使用批量更新
PreparedStatement ps=con.prepareStatement("INSERT INTO "+sname+" VALUES (?,?,?,?,?,?,?,?,?)");
while((newl=bfr.readLine())!=null)
{
....
ps.setString(1, date);
ps.setFloat(2, open);
.....
preparedStatement.addBatch();
}
preparedStatement.executeBatch();