我想减少我的java脚本读取文本文件并将其存储到mysql数据库的时间

时间:2016-02-07 08:30:01

标签: java mysql jdbc

我写的代码大约需要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

我想尽可能减少时间,而且我是初学者。请帮忙。

2 个答案:

答案 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();