保存ResultSet以用作写入文件的输入

时间:2017-11-18 17:25:39

标签: java jdbc resultset

我试图将ResultSet数据库查询保存到ArrayList中以用作写入文件的输入但我的内存不足。表I中有大约116k行数据。我尝试直接写入readDB()方法中的文件,并创建一个大约3.3 MB的CSV文件。这是我的代码。

public class Main {

    public static void main(String[] args) {

        DBAccess dbAccess = new DBAccess();

    }
}

读取数据库的类和方法。

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class DBAccess {

    public List<String> readDB() {

        String url = "jdbc:Cobol://Dev/Project Files/DatAndCpyFiles";


        try (Connection con = DriverManager.getConnection(url, "", "");
             Statement stmt = con.createStatement())

        {

            stmt.setFetchSize(10);

            Class.forName("com.hxtt.sql.cobol.CobolDriver").newInstance();


            String sql = "select * from PROFS";


            ResultSet rs = stmt.executeQuery(sql);


            List<String> result = new ArrayList<>();

            ResultSetMetaData resultSetMetaData = rs.getMetaData();
            int iNumCols = resultSetMetaData.getColumnCount();
            for (int i = 1; i <= iNumCols; i++) {
                result.add(resultSetMetaData.getColumnLabel(i) + ";");
            }
            String row;

            while (rs.next()) {
                for (int i = 1; i <= iNumCols; i++) {

                    row = rs.getString(i);

                    row = row == null ? " " : row.replaceAll("\u0086", "å");
                    row = row == null ? " " : row.replaceAll("\u008F", "Å");
                    row = row == null ? " " : row.replaceAll("\u0084", "ä");
                    row = row == null ? " " : row.replaceAll("\u008E", "Ä");
                    row = row == null ? " " : row.replaceAll("\u0094", "ö");
                    row = row == null ? " " : row.replaceAll("\u0099", "Ö");
                    row = row == null ? " " : row.replaceAll("\u0081", "ü");
                    row = row == null ? " " : row.replaceAll("\u009A", "Ü");
                    row = row == null ? " " : row.replaceAll("\u0082", "é");
                    row = row == null ? " " : row.replaceAll("\u0090", "É");

                    result.add(result + row.trim() + ";");
                }
            }

            rs.close();
            System.out.println("Returning result");

            return result;

        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
            return null;
        }
    }
}

错误消息

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
    at java.lang.StringBuilder.append(StringBuilder.java:136)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at java.util.AbstractCollection.toString(AbstractCollection.java:462)
    at java.lang.String.valueOf(String.java:2994)
    at java.lang.StringBuilder.append(StringBuilder.java:131)
    at se.spedweb.DBAccess.readDB(DBAccess.java:56)
    at se.spedweb.Main.main(Main.java:15)

我可以为此提供哪些其他数据结构?我是否使用了错误的方法?我只能append到文件而不是add列出方法,但我认为写入文件并在单独的类中读取数据库会更清楚,也许这是错误的。

1 个答案:

答案 0 :(得分:0)

如果使用命令行选项运行java,请尝试使用-Xmx,您可以手动设置堆的大小。尝试将其设置为-Xmx2048m。 注意:如果您使用IDE,快速谷歌会告诉您如何更改它,有这样做的方法