我想做以下事情:
- 连接到Postgres数据库并选择一个特定表的内容,每次2行
- 将这两行转换为CSV字符串,并将该字符串通过网络发送到RESTful API端点
我遇到的问题是,为了处理ResultSet并将其转换为CSV字符串,我需要调用rs.next()
,但在这样做时,我正在从数据库中提取下一个"批处理"。下面是我到目前为止的代码:
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();
}
我怎样才能做到这一点,使每个"批"的2行被处理并转化为CSV字符串?我想这样做,因为我要在一个非常大的表上运行它,这将不适合内存(我只是用批处理大小为2来测试它)。
您可以使用ResultSet.setFetchSize(int)设置读取大小,但通常您不应该关注整个表在内存中的拟合,而让驱动程序完成这项工作。