存档(在平面文件中)然后清除大量数据的最佳方式

时间:2016-12-17 16:30:47

标签: java jdbc resultset large-data

我写了下面的程序来实现这个目标:

           try {
                PreparedStatement statement = connection.prepareStatement(
                    "SELECT * FROM some_table some_timestamp<?)");
                statement.setTimestamp(1, new java.sql.Timestamp(dt.getTime()));
                ResultSet resultSet = statement.executeQuery();

                CSVWriter csvWriter = new CSVWriter(new FileWriter(activeDirectory + "/archive_data" + timeStamp + ".csv"), ',');
                csvWriter.writeAll(resultSet, true);
                csvWriter.flush();

              } catch (Exception e) {
                 e.printStackTrace();
               }


            // delete from table
            try {
                PreparedStatement statement = connection.prepareStatement(
                        "DELETE FROM some_table some_timestamp<?)");
                statement.setTimestamp(1, new java.sql.Timestamp(dt.getTime()));
                statement.executeUpdate();
            } catch (Exception e) {
                e.printStackTrace();
            }


        }

        dbUtil.close(connection);

以上程序只适用于平均情况,但我想知道如何改进这个程序:

  1. 在没有超载应用程序服务器的情况下顺利运行一百万条记录

  2. 考虑到在该程序运行时会有许多记录插入到同一个表中,我如何确保该程序存档,然后清除完全相同的记录。

  3. 更新:我正在使用openscv http://opencsv.sourceforge.net/

1 个答案:

答案 0 :(得分:0)

我想提出几点建议:

  1. 不要将时间用作限制点。这可能是原因 不可预知的错误。时间在不同的地方可能会有所不同 不同的环境所以我们应该小心时间。代替 时间使用sequence
  2. 使用connection pool从数据库中获取数据
  3. 将数据从db保存在不同的文件中。你可以存储它们 不同的驱动器之后,您必须连接信息 来自他们。
  4. 使用memory mapped files
  5. 使用多线程模型进行获取和存储/恢复 信息。 注意:JDBC doens不支持多线程连接 游泳池是你的帮手
  6. 这些步骤仅涉及java部分。您需要在数据库方面拥有良好的设计。不容易,对吧?但这是使用大数据的代价。