大数据量导出的问题

时间:2023-01-11 23:53:21

为了性能考虑,dataset默认的最大pageSize为2000。
可以在setting.xml中更改:
settin.xml中对dataset记录数的上限设定:

  
  
  1. <property name="data.maxRecordCountInDataset" value="2000"/>

2000是默认值。

异常:java.lang.OutOfMemoryError: Java heap space
Excel导出还是很占服务器内存的,如果报内存溢出则是服务器内存太小,调一下服务器内存大小。
tomcat的内存占用请参考这里:http://darkmasky.javaeye.com/blog/256828

另外,Excel的一个WorkSheet下的记录数为65000多条,超过这个数目无法导出。

关于四种dataMode
dataMode有四个值:server-all,server-current-page,client-visible,client-selected.

若处理不当,dataMode选择server-all可能出现异常:java.lang.ArithmeticException: / by zero

对于Dataset的pageSize来讲,有一个默认的规则,就是如果pageSize设置为0,那么加载数据的时候则按照不分页处理。
对于DBDataset来讲,其load方法内已经自动处理了这个问题,无需单独拿出来注意。
但是对于其他类型的自行加载数据的Dataset,需要在数据加载代码中处理pageSize为0的情况,出现pageSize为0的情况下,则不限制加载数据的多少。

当然,Export2ExcelCommand提供了另外一个参数maxRow,如果设置了这个参数,那么dataset的pageSize会被设置成maxRow,这样在代码里面就不用单独的去处理了。
个人推荐设置Export2ExcelCommand的maxRow为足够大的数值,推荐65000。


后两种要注意客户端数据的数量,超过2000条不建议使用这两种模式。

有可能会遇到这种异常:com.bstek.dorado.utils.xml.XmlParseException: org.jdom.input.JDOMParseException: Error on line 1: Content is not allowed in prolog.

这是因为虽然http协议本身不限制post数据的大小,但是一般情况下,web服务器会限制post数据的大小,一般为1M,所以在数据量很大的情况下,会出现xml被截断的情况,这样就会出现上面那个异常。

对于这个问题,可尝试对web服务器的post的数据大小进行设置,允许用户提交足够大的数据到服务器端。