Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何有效地阅读15+;从SQL Server中删除100万条记录,进行一些处理,然后将它们写入平面文件?_Java_Sql_Sql Server 2008_Jdbc - Fatal编程技术网

Java 如何有效地阅读15+;从SQL Server中删除100万条记录,进行一些处理,然后将它们写入平面文件?

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数据库中读取1500多万条记录,对它们执行一些处理,并将结果写入一个平面文件

如何使用Java高效地实现这一点


我最初的想法是在执行查询时(如果可能的话)分块查询数据或将结果流式返回以进行处理。

看起来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来支付,因为这是我工作场所的每个人都能接受的。问问他们是否愿意购买更多的硬件;)需要什么样的处理?