# HG changeset patch
# User Asier Lostalé <asier.lostale@openbravo.com>
# Date 1338533626 -7200
# Node ID 53a9d2f1b63f7a79a0e8bbbc99153ec921c3bc18
# Parent  25447e74a93fa889844ae68492d9825e92fe9751
fixed bug 20658: Heap space problem when exporting big csv files

In fetch for csv exportation, changed evict with clear. Evict removes current
record from memory, but it doesn't remove its references, this causes unnecesary
memory consumption.

diff -r 25447e74a93f -r 53a9d2f1b63f modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java
--- a/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java	Wed May 30 07:36:48 2012 +0200
+++ b/modules/org.openbravo.service.json/src/org/openbravo/service/json/DefaultJsonDataService.java	Fri Jun 01 08:53:46 2012 +0200
@@ -178,6 +178,7 @@
   }
 
   public void fetch(Map<String, String> parameters, QueryResultWriter writer) {
+    long t = System.currentTimeMillis();
     final String entityName = parameters.get(JsonConstants.ENTITYNAME);
     final DataEntityQueryService queryService = createSetQueryService(parameters);
     queryService.setEntityName(entityName);
@@ -187,13 +188,20 @@
     toJsonConverter.setAdditionalProperties(JsonUtils.getAdditionalProperties(parameters));
 
     final ScrollableResults scrollableResults = queryService.scroll();
+    int i = 0;
     while (scrollableResults.next()) {
       final Object result = scrollableResults.get()[0];
       final JSONObject json = toJsonConverter.toJsonObject((BaseOBObject) result,
           DataResolvingMode.FULL);
       writer.write(json);
-      OBDal.getInstance().getSession().evict(result);
+      i++;
+      // Clear session every 1000 records to prevent huge memory consumption in case of big loops
+      if (i % 1000 == 0) {
+        OBDal.getInstance().getSession().clear();
+        log.debug("clearing in record " + i + " elapsed time " + (System.currentTimeMillis() - t));
+      }
     }
+    log.debug("Fetch took " + (System.currentTimeMillis() - t) + " ms");
   }
 
   private DataEntityQueryService createSetQueryService(Map<String, String> parameters) {
