如何解决 OrmLite 中的巨大 byte[] 问题

How to resolve huge byte[] issue in OrmLite

我有 2 个表 Header 和二进制

Header 类似于:

@DatabaseTable(tableName = Header.TABLE_NAME)
public class Header extends Table {
    @DatabaseField(
            generatedId = true,
            columnName = HEADER_ID,
            dataType = DataType.LONG_OBJ
    )
    private Long id;

    @ForeignCollectionField(orderColumnName = Binary.BINARY_ORDER, orderAscending = true)
    private Collection<Binary> binaries=new ArrayList<Binary>();
}

二进制是:

@DatabaseTable(tableName = Binary.TABLE_NAME)
public class Binary {
    @DatabaseField(
            generatedId = true,
            columnName = BINARY_ID,
            dataType = DataType.LONG_OBJ)
    private Long id;

    @DatabaseField(
            columnName = BINARY_HEADER_ID,
            foreign = true,
            foreignAutoCreate = true,
            foreignAutoRefresh = true,
            //uniqueCombo = true,
            canBeNull = false, //there always must be a link to Item._ID
            columnDefinition = "integer constraint fk_4 references `"+ Header.TABLE_NAME+"`(`"+ Header.HEADER_ID+"`) on delete cascade"
    )
    private Header header=null;

    @DatabaseField(
            columnName = BINARY_ORDER,
            //uniqueCombo = true,
            canBeNull = false,
            dataType = DataType.INTEGER_OBJ,
            defaultValue = "0"
    )
    private Integer order =0;

    @DatabaseField(
            columnName = BINARY_CHUNK,
            dataType = DataType.BYTE_ARRAY)
    private byte[] chunk=null;
}

我的问题在 byte[] chunk 字段,因为每个块的大小是 1 MB,它们的数量几乎是无限的,所以当我读取 Header 记录时,OrmLite 会隐式读取 Collection<Binary> 包含大量内容的列表 - 因此可能会导致内存耗尽。

我应该如何声明我的表来解决这个问题?

首先声明你的集合是惰性的并使用外部集合:

 @ForeignCollectionField(orderColumnName = Binary.BINARY_ORDER, orderAscending = true, eager=false)
 private ForeignCollection<Binary> binaries; //to be able to retrieve CloseableIterator 

如何迭代数据:延迟加载数据意味着保持连接以确保数据获取,因此 iterator.close();

    CloseableIterator<Binary> iterator = binaries.closeableIterator();
    try {
        while(iterator.hasNext()){
        Binary bin= iterator.next();
        //do stuff
        bin.setChunk(null) //discard if not needed any more
       }
    } finally {
        // must always close our iterators otherwise connections to the database are held open
        iterator.close();
    }

这只是一个提示,因为我不知道您将如何处理数据,但您的代码应该看起来像这样。