0

我对 java 和数据库比较陌生,因此请您帮助我优化代码。我有大约 20 个带有逗号分隔值的文本文件。每个文本文件有大约 10000 行基于每行中的第三个值,我将数据插入到不同的表中。每次我检查第三个值并使用不同的方法来保存这些数据。我的代码如下。有人可以告诉我这是否是执行此操作的正确方法。提前致谢。

public  void readSave() throws SQLException
{
    File dir = new File("C:\\Users\\log");
    String url = Config.DB_URL;
    String user= Config.DB_USERNAME;
    String password= Config.DB_PASSWORD;
    con= DriverManager.getConnection(url, user, password);
    con.setAutoCommit(false);
    String currentLine;
    if (!dir.isDirectory())
        throw new IllegalStateException();
    for (File file : dir.listFiles()) {
        BufferedReader br;
        try {
            br = new BufferedReader(new FileReader(file));
            while ((currentLine = br.readLine()) != null) {
                List<String> values = Arrays.asList(currentLine.split(","));
                if (values.get(2).contentEquals("0051")) 
                    save0051(values,con);
                else if(values.get(2).contentEquals("0049"))
                    save0049(values,con);
                else if(values.get(2).contentEquals("0021"))
                    save0021(values,con);
                else if(values.get(2).contentEquals("0089"))
                    save0089(values,con);
                if(statement!=null)
                    statement.executeBatch();
            }
        } catch (FileNotFoundException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    try { 
        con.commit();
        statement.close();
        con.close();
    } 
    catch (Exception e) {}
}

private void save0051(List<String> values, Connection connection) throws SQLException {
    // TODO Auto-generated method stub
    String WRITE_DATA = "INSERT INTO LOCATION_DATA"
            + "(loc_id, timestamp, message_id" +
            ) VALUES (?,?,?)";
    try {
        statement = connection.prepareStatement(WRITE_DATA);
        statement.setString(1, values.get(0));
        statement.setLong(2, Long.valueOf(values.get(1)));
        statement.setInt(3, Integer.valueOf(values.get(2)));
        statement.addBatch();
    } catch (SQLException e) {
        e.printStackTrace();
        System.out.println("Could not save to DB, error: " + e.getMessage());
    }
    return;
}
4

4 回答 4

5
  1. 不要在循环中创建数据库连接。这是一项昂贵的操作,您应该只创建一次。
  2. 不要PreparedStatement在循环中创建。创建一次并重复使用它。
  3. 不要在每次插入后提交。阅读有关使用批处理插入的信息。如果您只进行一次提交,例如 200 个 INSERT,这将显着减少“提交开销”。
于 2013-05-02T13:06:08.133 回答
3

如果这对性能至关重要,我建议进行一些更改。

  1. 将连接创建移出循环,您不希望这样做数千次。
  2. 由于每个函数都重复执行相同的查询,因此您可以缓存 PreparedStatements,并重复执行它们,而不是在每个查询中重新创建它们。这样,数据库将只需要优化一次查询,并且每个查询将只传输查询的数据,而不是整个查询和数据。
于 2013-05-02T13:09:43.157 回答
0

刚刚发现已经提到了批量插入,但这是我遇到的一个很好的教程页面,我认为他解释得很好

于 2013-05-02T13:21:38.793 回答
0

使用 JDBC Batch INSERT,executeBatch()更快,因为插入是作为列表一次性完成的。请参阅 http://javarevisited.blogspot.com/2013/01/jdbc-batch-insert-and-update-example-java-prepared-statement.html 使用 JDBC 进行批量插入的有效方法 http://www.java2s。 com/Code/Java/Database-SQL-JDBC/BatchUpdateInsert.htm

于 2013-05-02T13:30:51.993 回答