2012-08-01 32 views
2

我出口一個非常巨大的碧玉報告(約20000頁)。對於以避免內存不足的錯誤,通過不同的網站作爲建議的目的,我使用JRSwapFileVirtualize如下圖所示:正確使用JRSwapFileVirtualizer?

我的問題是:

1)我已經配置MAXSIZE 1000。 20000頁的報告可以嗎?

2)我在方法調用'fillReport'後立即清理虛擬器。是否正確,或者在將報告導出到XLS後需要清理虛擬器?

3)無論如何在導出報告後清理虛擬器,對我有幫助嗎?

4)創建JasperPrint對象,邏輯寫在服務器端。導出報告邏輯,用java客戶端編寫。如果我應該清理虛擬器,那麼在導出報告之後,我該如何處理這種情況?因爲在這種情況下,我需要在服務器端創建此虛擬器的靜態對象(因爲JRSwapFileVirtualizer不可序列化,因此我無法在服務器和客戶端之間創建並傳遞它),然後在導出後再次創建靜態對象,我需要調用服務器端方法來清理虛擬器。我在考慮創建靜態對象是一種風險,因爲如果對服務器端邏輯進行多次調用,那麼virtualizer靜態對象將持有對由最新調用創建的交換文件的引用,並且在清理之後由於這種情況,以前的交換文件可能不會被刪除。

我發現了更多關於此主題的信息: 在jasper爲使用virtualizer提供的示例中,他們只在調用common export時纔會清理虛擬器,這會導出多個類型的文件。他們沒有要求清理,當他們只出口單一類型的報告:

else if (TASK_CSV.equals(taskName)) 
{ 
    exportCSV(jasperPrint); 
}  
else if (TASK_EXPORT.equals(taskName)) 
{ 
    exportPDF(jasperPrint); 
    exportXML(jasperPrint, false); 
    exportHTML(jasperPrint); 
    exportCSV(jasperPrint); 

    // manually cleaning up 
    virtualizer.cleanup(); 
} 

此外,他們還沒有提到XLS出口在這個例子中。我發現那裏的人也面臨着同樣的問題,另一個鏈接,但也沒有解決任何提到:

http://www.jasperforge.org/plugins/espforum/view.php?group_id=102&forumid=103&topicid=95689

而且這個環節說,我們可以使用JRXlsxExporter代替。但JRXlsxExporter只導出excel 2007格式不在2003年。

我正在使用JExcelApiExporter.exportReport()將報告導出到XLS,對於大型報告它不起作用。 請幫我解決這個問題。 任何小提示或建議是可觀的。讓我知道,如果你需要更多的信息。 謝謝。

+0

任何人都可以幫助找出這些問題的答案嗎?我無法在碧玉手冊中找到適當的信息。 – user613114 2012-08-02 05:36:38

回答

1

1.對於第一個問題, 這實際上取決於您爲報表生成應用程序提供了多少堆大小。嘗試試錯誤情況&你會得到確切大小

關於第二個問題

2.As按照您第一個代碼段, 您填寫報告,並立即在虛擬器應用清理。所以即使你已經創建了報告,在清理之後你的交換文件將被銷燬&以來的數據。 - 一旦確認完成報告數據使用情況,您應該在虛擬化器上應用清理。所以在這種情況下,導出爲特定格式後。

3.cleanup是立即銷燬交換文件。 因此,如果您不打算在導出應用清理後重復使用該報告,那麼這是最好的辦法。 注意:即使你沒有明確清理它,垃圾收集器也會在處置jasperPrint時將其銷燬。

你的第四點對我來說還不太清楚,你說的是jasperPrint已經在服務器端創建....並且導出邏輯已經寫在客戶端......如何導出邏輯可以在客戶端沒有參考JasperPrint,這是服務器端.... ?? 1!

+0

親愛的Swapy,非常感謝您的回覆。 1)正如我前面所說,填充報告是在服務器端完成的,它創建了JasperPrint對象。這個對象使用傳輸對象傳遞給客戶端,因爲JasperPrint是可序列化的(public class net.sf.jasperreports.engine.JasperPrint implements java.io.Serializable,et.sf.jasperreports.engine.JRPropertiesHolder)2)根據我的理解虛擬器僅用於填充報告,因爲填充報告是碧玉的一部分。導出報告也是由第三方庫完成的。請讓我知道如果我的不合格是不正確的。 – user613114 2012-08-06 12:41:26

+0

Hello Swapy,在jasper網站上提到,虛擬器僅在填寫報告時使用:http://jasperforge.org/uploads/publish/jasperreportswebsite/trunk/sample.reference/virtualizer/index.html – user613114 2012-08-06 12:44:31

+0

Jasper也讓使用虛擬器進行導出。請檢查此鏈接http://stackoverflow.com/a/7585158/966078 – Cid 2012-11-21 10:37:12

1

Ok ..當您應用fillReport時,您的所有數據集(記錄)將保存在jvm(堆空間)中,出口商將在導出爲任何格式時使用這些數據集。

這裏,如果不是什麼JVM的數據集的大小增加了,你會用outOfMemeryError吊死,這樣反而利用JVM內存,虛擬器(FileVirtualizer &交換文件)將幫助您的數據集中存儲到文件(最終它使用序列化將數據集存儲到文件中)。

關於此文章:填寫報告時使用它是正確的:因此,在填充(調用fillReport)時,需要將一些對象存儲在內存中,需要使用虛擬器立即訪問剩餘文件&。因此,當您嘗試訪問剩餘記錄(使用導出器選項進行分頁)時,JasperPrint將從文件中提取這些記錄,根據需要進行未使用頁面的交換。

在這裏,我只說abt JRFileVirtualizer JRSwapFileVirtualizer。 在JRGzipVirtualizer的情況下,存儲將使我成爲內存壓縮格式。如果您沒有直接訪問磁盤,將使用哪個。

+0

因此,從您的評論我明白,虛擬器將用於填充以及導出報告。所以如果這種理解是正確的,我應該怎麼處理呢?正如我前面提到的,在我的情況下,填寫報告是在服務器端完成的。我將JasperPrint對象發送給客戶端。客戶端將其導出。那麼在這種情況下,客戶端如何訪問服務器上的虛擬化數據? (JRSwapFileVirtualizer不可序列化)。 – user613114 2012-08-08 14:36:07

+0

所以我猜想虛擬器填充的報告不能被利用。 因此,在客戶端導出多少頁面在文檔中獲得[我想它應該是1000如果你已經配置虛擬器使用1000頁面緩存,如在我們的代碼中所示] – swapy 2012-08-14 10:02:44

+0

你好Swapy,我很抱歉的回覆。在客戶端XLS導出(JExcelApiExporter.exportReport())失敗,出現內存不足錯誤。在JasperPrint對象中,我看到大約有170,000行數據和大約3500頁。 – user613114 2012-08-21 09:34:52