簡體   English   中英

使用Java將大數據從sqlserver導出為CSV

[英]Exporting large data into CSV from sqlserver using java

我在sqlserver中有900萬條記錄。 我正在嘗試將其導入到csv文件中,以便可以將該數據放入mongo db中。 我已經為sql2csv導入編寫了Java代碼。 但是我有兩個問題

  1. 如果我讀取列表中的所有數據,然后嘗試插入CSV,則出現內存不足的異常。
  2. 如果我逐行閱讀並嘗試在CSV中插入每一行,則導出數據需要很長時間。

我的代碼是這樣的

 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,甚至更好。

也許您應該通過使用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;
...

只需保留偏移量即可。

另一個例子

如果使用此解決方案,則需要修改代碼以附加到Excel文件的末尾-不要將所有結果都保留在內存中,否則仍然會遇到OutOfMemoryException。

絕對地,當處理如此多的記錄時,在轉儲為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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM