优化数据库插入java

时间:2013-05-02 13:04:01

标签: java database

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

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 个答案:

答案 0 :(得分:4)

  1. 不要在循环中创建数据库连接。这是一项昂贵的操作,您只应创建一次。
  2. 不要在循环中创建PreparedStatement。创建一次并重复使用它。
  3. 每次INSERT后都不要提交。 Read about using batches for inserting。如果你只提交200个INSERT,那么这会大大减少“提交开销”。

答案 1 :(得分:3)

如果这对性能至关重要,我建议做一些改变。

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

答案 2 :(得分:0)

答案 3 :(得分:0)

相关问题