0

我需要从文件中读取大约 1 000 000 行数据并使用 Java 将数据上传到数据库中。以下是要求的详细信息和我已经编写的一些解决方案:

  1. 从文件(任何格式的 XML、平面文件、CSV)中读取数据。根据文件格式初始化类(使用工厂模式)。对于文本文件,我使用的是 BufferedReader,然后将创建的每个对象(例如员工)添加到列表中。同样,对于 XML,我正在使用 SAXParser,并且在从一个对象读取数据后将其添加到列表中。

  2. 但我认为我们不能保存或者我们应该在列表中保存 1 000 000 个对象。所以我需要在读取文件并且列表达到一定大小时将数据并行刷新到数据库中。这就是我卡住的地方。这应该如何处理?我是否应该运行一个并行线程,一旦列表大小达到 1000,它将更新数据库中的数据,同时读取文件的线程应该等待?DB 可以是任何数据库 Oracle/MS 访问。

下面是读取文本文件的代码:

public class FlatFileLoader implements Loader {

@Override
public List<Employee> readData(String path) {

    try {
        List<Employee> personList =  new ArrayList<Person>();
        FileReader fr = new FileReader(path);
        BufferedReader br = new BufferedReader(fr);
          String line=null;

          while ((line = br.readLine()) != null) {
              Employee person = scanLine(line, DataConstants.DELIMITER);
              if(null != person)
              personList.add(person);

            }
          br.close();

        }
        catch (IOException e) {
          System.err.println(e);
        }
    return null;
}

private Employee scanLine(String recordLine, String delim) {
    Employee person=null;
    List data= new ArrayList();
    StringTokenizer lineScanner = new StringTokenizer(recordLine, delim);
    while (lineScanner.hasMoreElements()) {
        String nextEle= (String) lineScanner.nextElement();
        if(nextEle.equalsIgnoreCase("FIRST_NAME")){
            break;
        }
        data.add(nextEle);

    }
    if(data.size() > 0){
        DataUtil.populatedata(data);
    }
    return person;
}

}

方法 DataUtil.populatedata(data) 创建Employee对象。那么我应该在哪里调用更新数据库中的数据呢?也欢迎任何改进上述代码的建议。

4

1 回答 1

0

您要如何刷新数据基本上取决于您要使用多少内存,但是在加载 1000 个左右的对象后刷新数据是一个好主意,因为您不必为每个加载的 Employee 实例写入数据库,也不会 1000对象占用大量内存。

如果您使用并行线程刷新 Employee 对象列表,请注意线程同步问题:在创建线程 t2 以插入下一个 1000 个对象之前,线程 t1 可能无法完成将其 1000 个对象插入到 db 中。因此,两个线程现在将对象并行插入 DB,因此输入文件(XML、文本)中数据的顺序可能不会保留在 DB 中。

我的建议:保持简单,让读者在数据插入数据库时​​等待。无论如何,1000000 个对象并不多...

在 personList.add(person) 之后插入 DB 插入代码:

....
    if(personList.size()>=1000){
        flushToDB(personList);
        personList.clear();
    }
....

同时,

void flushtoDB(List<Employee> persons){
    for(Employee person:persons){
        //insert Employee object into DB
    }
}
于 2012-09-02T08:32:01.963 回答