私は、SQL Server データベースから 1,500 万以上のレコードを読み取り、それらに対して何らかの処理を実行し、結果をフラット ファイルに書き込む作業を行いました。
Javaを使用してこれを効率的に行うにはどうすればよいですか?
私の最初の考えは、データをチャンクでクエリするか、クエリの実行中に処理のために結果をストリーミングすることです(それが可能な場合でも)。
私は、SQL Server データベースから 1,500 万以上のレコードを読み取り、それらに対して何らかの処理を実行し、結果をフラット ファイルに書き込む作業を行いました。
Javaを使用してこれを効率的に行うにはどうすればよいですか?
私の最初の考えは、データをチャンクでクエリするか、クエリの実行中に処理のために結果をストリーミングすることです(それが可能な場合でも)。
sql-server の jdbc ドライバーは fetchsize ヒント (一度に読み取る行数を示唆する) を尊重しているように見えるため、1 つのクエリを発行して結果セットを反復処理し、行を処理してファイルに書き込むことができるはずです。あなたが行く。例えば:
public static void toFlat(Connection conn, File file, String destcode) {
PreparedStatement ps = null;
ResultSet rs = null;
BufferedWriter out = null;
try {
ps = conn.prepareStatement(
// col#: 1 2 3 4
"SELECT threatid, lastname, firstname, flightnum " +
"FROM travel.passengers " +
"JOIN threats.aliases USING (firstname, lastname) " +
"WHERE destination = ?" // param# 1
);
ps.setString(1,destcode); // param# 1
out = new BufferedWriter(new FileWriter(file));
// provides hint for driver to load x rows at a time:
ps.setFetchSize(1000);
ps.executeQuery();
rs = ps.getResultSet();
while(rs.next()) {
Integer threatid = rs.getInt(1);
String lastname = rs.getString(2);
String firstname = rs.getString(3);
Integer flightnum = rs.getInt(4);
//rubber meets road:
String row = processRow(threatid, lastname, firstname, flightnum);
out.write(row);
}
} catch(SQLException e) {
// TODO
} catch (IOException e) {
// TODO
e.printStackTrace();
} finally {
try {
ps.close();
} catch(Exception e){
//TODO
}
try {
rs.close();
} catch(Exception e){
//TODO
}
try {
out.close();
} catch(Exception e){
//TODO
}
}
}