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

标签 java mysql jdbc

对于只有 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/

相关文章:

c# - 将 MYSQL 连接到 Windows 窗体 C# 的最安全方法

java - H2:如何判断表是否存在?

Java DatabaseMetaData.getSchemas() 返回空 ResultSet,预期非空 ResultSet

java.lang.NoSuchMethodError 通过 Spring 连接 mongoDb 时出错

java - 重命名子类中的变量

java - 安卓 : How can I convert a Time with am and pm format into integer seconds

java - 向数据库插入数据但出现 MySQLSyntaxErrorException : You have an error in your SQL syntax 错误

java - Java 中嵌套类中的静态成员

mysql - 在同一张表上更新后在触发器中更新表

mysql - 在单个制表符分隔文件中存储 ascii 和二进制数据