Java 如何有效地阅读15+;从SQL Server中删除100万条记录,进行一些处理,然后将它们写入平面文件?
我的任务是从SQL Server数据库中读取1500多万条记录,对它们执行一些处理,并将结果写入一个平面文件 如何使用Java高效地实现这一点Java 如何有效地阅读15+;从SQL Server中删除100万条记录,进行一些处理,然后将它们写入平面文件?,java,sql,sql-server-2008,jdbc,Java,Sql,Sql Server 2008,Jdbc,我的任务是从SQL Server数据库中读取1500多万条记录,对它们执行一些处理,并将结果写入一个平面文件 如何使用Java高效地实现这一点 我最初的想法是在执行查询时(如果可能的话)分块查询数据或将结果流式返回以进行处理。看起来sql server的jdbc驱动程序尊重fetchsize提示(它建议一次读取多少行)因此,您应该能够发出一个查询,并在结果集中进行迭代,同时处理并将行写入文件。例如: public static void toFlat(Connection conn, File
我最初的想法是在执行查询时(如果可能的话)分块查询数据或将结果流式返回以进行处理。看起来sql server的jdbc驱动程序尊重fetchsize提示(它建议一次读取多少行)因此,您应该能够发出一个查询,并在结果集中进行迭代,同时处理并将行写入文件。例如:
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
}
}
}
sql server的jdbc驱动程序似乎尊重fetchsize提示(该提示建议一次读取多少行),因此您应该能够发出一个查询并迭代结果集,在执行过程中处理行并将行写入文件。例如:
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
}
}
}
如果有效性仅与读取相关,那么关于获取大小的答案就是解决方法。如果在数据库主机(=>localhost连接)上运行Java程序,它将提高性能
如果有效地应用于处理,则在SQL查询中尽可能多地执行。我们已经进行了测量,RDBMS的性能优于Java。例如,在Java中,过滤和排序需要更长的时间。在Java中重新实现数据库功能毫无意义,而且速度较慢
如果使用SQL查询不容易实现算法,请在存储过程中执行其他(过程性)处理,将其完全作为存储过程编写,或在SQL查询中使用存储函数。将存储函数与SQL查询结合使用是一种非常强大和快速的组合。
您的Java客户机只是读取结果,并将其直接写入磁盘。没有缓冲,没有处理,只有I/O
如果您使用的是Oracle、PostgreSql或DB2,您甚至可以用Java编写存储过程/函数。如果有效性仅与读取有关,那么关于获取大小的答案就是正确的。如果在数据库主机(=>localhost连接)上运行Java程序,它将提高性能
如果有效地应用于处理,则在SQL查询中尽可能多地执行。我们已经进行了测量,RDBMS的性能优于Java。例如,在Java中,过滤和排序需要更长的时间。在Java中重新实现数据库功能毫无意义,而且速度较慢
如果使用SQL查询不容易实现算法,请在存储过程中执行其他(过程性)处理,将其完全作为存储过程编写,或在SQL查询中使用存储函数。将存储函数与SQL查询结合使用是一种非常强大和快速的组合。
您的Java客户机只是读取结果,并将其直接写入磁盘。没有缓冲,没有处理,只有I/O
如果您使用的是Oracle、PostgreSql或DB2,您甚至可以用Java编写存储过程/函数。是否需要使用Java?这听起来正是我们要做的事情。你能在数据库中进行处理吗?在那里速度更快,可以利用多线程环境。我实际上已经在SSIS中实现了这一点(它工作得很好),但由于办公室政治和基础设施问题,该解决方案被否决了。我被要求用Java来支付,因为这是我工作场所的每个人都能接受的。问问他们是否愿意购买更多的硬件;)需要什么样的处理?这需要Java吗?这听起来正是我们要做的事情。你能在数据库中进行处理吗?在那里速度更快,可以利用多线程环境。我实际上已经在SSIS中实现了这一点(它工作得很好),但由于办公室政治和基础设施问题,该解决方案被否决了。我被要求用Java来支付,因为这是我工作场所的每个人都能接受的。问问他们是否愿意购买更多的硬件;)需要什么样的处理?