缓冲写入数据库以避免OutOfMemoryError

时间:2015-02-18 07:51:44

标签: java postgresql out-of-memory bufferedoutputstream

假设您有以下代码:

BufferedReader br = new BufferedReader(new InputStreamReader(new File("MyFile.txt")));
FooParser parser = new FooParser();
List<Foo> fooList = new ArrayList<Foo>();

try {
    String line = br.readLine();
    while (line != null && !line.isEmpty()) {
        Foo foo = parser.parse(line);
        fooList.add(foo);
        line = br.readLine();
    }
} catch (IOException ioe) {
    // handle it
}

以及后面的列表用于通过以下调用将对象写入数据库(确切地说是PostgreSQL):

dao.write(fooList);

现在,上面的代码看似简单易懂,但是,如果列表中的Foo个对象太多,导致问题OutOfMemoryError会导致问题。

所以,我想知道是否存在关于如何对数据库执行'缓冲'写入的某种类型或约定的模式,以避免在内存中保留最终存储在数据库中的大量对象?

我正在考虑沿着这些线路,受BufferedOutputStream的启发,保持缓冲区(可配置长度)的对象,一旦缓冲区填满,写入并刷新到dabatase。

由于我的手与此紧密相关(我只允许做小错误修正,而不是更改架构),这是一个足够好的方法和/或有更好的方法吗?

谢谢:D

1 个答案:

答案 0 :(得分:1)

您必须添加某种缓冲逻辑。我的缓冲区大小为“100”,如下所示。

String line = br.readLine();
    while (line != null && !line.isEmpty()) {
        Foo foo = parser.parse(line);
        fooList.add(foo);
        if(fooList.size() == 100){
            dao.write(fooList);
            fooList = new ArrayList<Foo>();
        }

        line = br.readLine();
    }