使用java从sqlserver导出大数据到CSV

时间:2015-02-27 14:09:19

标签: java sql-server mongodb csv

我在sqlserver中有900万条记录。我试图将其导入csv文件,以便我可以将该数据放入mongo db。我已经为sql2csv import编写了Java代码。但我有两个问题

  1. 如果我读取列表中的所有数据,然后尝试插入CSV,我就会失去异常。
  2. 如果我逐行阅读并尝试在CSV中插入每一行,则导出数据需要很长时间。
  3. 我的代码有点像

     List list = new ArrayList();  
        try {
            Class.forName(driver).newInstance();
            conn = DriverManager.getConnection(url, databaseUserName, databasePassword);
            stmt =  conn.prepareStatement("select  OptimisationId  from SubReports");
            result = null;
    
            result =   stmt.executeQuery(); 
            //  stmt.executeQuery("select * from Subscription_OptimisationReports");
            result.setFetchSize(1000);
    
            while (result.next()) {
                //System.out.println("Inside while");
                SubReportsBean bean = new SubReportsBean();
                bean.setOptimisationId(result.getLong(("OptimisationId")));
    
                list.add(bean);
                 generateExcel(list);
    
            }
            //generateExcel(list);  
            conn.close();
        }
    

    是否可以更快地导出所有数据?或者甚至更好,如果它可以直接导出到mongo而不是csv。

2 个答案:

答案 0 :(得分:1)

也许您应该通过使用LIMIT和OFFSET一次只读一点来对数据进行分页。

select  OptimisationId  from SubReports OFFSET 0 ROWS FETCH NEXT 1000 ROWS ONLY;
select  OptimisationId  from SubReports OFFSET 1000 ROWS FETCH NEXT 1000 ROWS ONLY;
select  OptimisationId  from SubReports OFFSET 2000 ROWS FETCH NEXT 1000 ROWS ONLY;
...

只需保留偏移的计数器。

Another Example

如果您使用此解决方案,则需要修改代码以附加到Excel文件的末尾 - 不要将所有结果保存在内存中,否则您仍会遇到OutOfMemoryException。

答案 1 :(得分:1)

当处理这么多记录时,在转储到CSV之前收集列表中的所有日期肯定会失败。

所以你的解决方案2就是你要走的路。

您的代码似乎与此解决方案相对应,但我认为您只是忘记移动列表声明或清空循环中的列表。你可以这样做:

try {
    Class.forName(driver).newInstance();
    conn = DriverManager.getConnection(url, databaseUserName, databasePassword);
    stmt =  conn.prepareStatement("select  OptimisationId  from SubReports");
    result = null;

    result =   stmt.executeQuery(); 
    //  stmt.executeQuery("select * from Subscription_OptimisationReports");
    result.setFetchSize(1000);

    while (result.next()) {
        //System.out.println("Inside while");
        SubReportsBean bean = new SubReportsBean();
        bean.setOptimisationId(result.getLong(("OptimisationId")));
        List list = new ArrayList();  
        list.add(bean);
         generateExcel(list);

    }
    //generateExcel(list);  
    conn.close();
}