将Excel文件(保存在几个blob中)按顺序读入一个InputStream

时间:2014-01-30 12:11:55

标签: java sql excel hibernate memory

我需要处理大Excel个文件。我的问题是heap space,特别是XLS格式。即使我有一个Apsose LighCells API来按顺序解析它,我也需要从数据库中检索文件。

到目前为止,我将数据库中的文件放在40kb的块中。我有一个Import表(存储与导入相关的一般信息,例如开始和结束时间,数据类型等)和一个ImportData表(包含数据块作为blob)。我在ImportImportData之间存在一对多的关系:

<hibernate-mapping>   <class name="com.company.import.pojos.Import
table="IMPORT_TABLE">
    <id name="id" type="integer">
      <column name="ID" />
      <generator class="some.id.generator.IdGenerator"></generator>
    </id>

    <property name="startTime" type="timestamp">
      <column name="START" />
    </property>

    <property name="endTime" type="timestamp">
      <column name="END" />
    </property>

    <property lazy="false" name="datatzpe" type="com.company.import.enums.ImportDataType">
      <column name="DATATYPE" />
    </property>

    <bag name="importDataList" table="IMPORT_DATA" lazy="true" cascade="all" inverse="false">
      <key column="IMPORT_TABLE_ID"/>
      <one-to-many class="com.company.import.pojos.ImportData"/>
    </bag>

  </class> </hibernate-mapping>


<hibernate-mapping>   <class
name="com.company.import.pojos.ImportData" table="IMPORT_DATA">

    <id name="id" type="integer">
      <column name="ID" />
      <generator class="some.id.generator.IdGenerator"></generator>
    </id>

    <property name="importTableID" type="integer">
      <column name="IMPORT_TABLE_ID" />
    </property>

    <property name="data" type="binary">
      <column name="DATA" />
    </property>

    <property name="order" type="integer">
      <column name="ORDER" />
    </property>   </class> </hibernate-mapping>

我使用Hibernate (4.2.3.Final),但即使lazy loading也不是一个选项,因为那样我将在内存中拥有ImportData个对象的完整列表,这就是为什么我得到一个OutOfMemoryError而我想要避免这样做。

提供更多内存不是一个选项(应用程序也运行在运行其他应用程序的容器上,并且多个用户可能同时处理文件,因此最终会发生堆空间问题),因此我正在寻找一种方法始终读取下一个数据块并将其提供给Aspose API的流。

我在Aspose中创建我的工作簿就像这样:

InputStream inStream = ....;// get the input stream somehow
Workbook workbook = new Workbook(inStream);

1 个答案:

答案 0 :(得分:1)

您可能需要实现自己的InputStream,它将多个IS作为一个处理,处理当您到达一个IS的末尾时,关闭它并选择下一个以填充读取缓冲区的其余部分。

我不知道这种行为的任何实现。

你的档案有多大?