如何批处理数据库表的内容?

时间:2015-07-09 06:43:48

标签: java jdbc

我想做以下事情:

  • 连接到Postgres数据库,一次选择2行特定表的内容
  • 取2行,将它们转换为CSV字符串,然后通过网络将该字符串发送到RESTful API端点

我遇到的问题是,为了处理ResultSet并将其转换为CSV字符串,我需要调用rs.next(),但是这样做,我正在拉下一批'批次&#39 ;来自数据库。这是我到目前为止的代码:

public void load() throws Exception {
        Connection conn = connectToDB();
        conn.setAutoCommit(false);
        Statement st = conn.createStatement();

        st.setFetchSize(2);
        ResultSet rs = st.executeQuery("SELECT * FROM friends");
        String csv = resultSetToCSV(rs);
        System.out.println("CSV output is: " + csv);

        rs.close();
        st.close();
    }

    private static String resultSetToCSV(ResultSet rs) throws Exception {
        int colCount = rs.getMetaData().getColumnCount();
        StringBuilder result = new StringBuilder();

        while (rs.next()) {
            for (int i = 0; i < colCount; i++) {
                result.append("\"").append(rs.getString(i + 1)).append('"');
            }
            result.append(System.lineSeparator());
        }

        return result.toString();
    }

我如何让这个工作,以便每个&#34;批次&#34;处理2行并转换为CSV字符串?我想这样做是因为我将在一个非常大的桌子上运行它,这个桌子不适合内存(我只是测试它的批量大小为2)。

1 个答案:

答案 0 :(得分:0)

您可以使用ResultSet.setFetchSize(int)设置提取大小,但通常您不应该关心内存中的整个表,并让驱动程序完成工作。