对于只有 3000 行长的文件,我编写的代码大约需要 3 分钟。但这对于我的代码来说太长了。谁能指导我我做错了什么?
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
我想尽可能减少时间,而且我是初学者。请帮忙。
最佳答案
您可以将PreparedStatement
移到for循环之外。
因此该语句只会“准备”一次(这意味着您的sql仅被解析一次)并在循环中执行n次。
另外禁用自动提交
并提交每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 您将获得一些额外的性能
关于java - 我想减少 java 脚本读取文本文件并将其存储到 mysql 数据库的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35251356/