我有 2 个表头和二进制表
标题类似于:
@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
字段,因为每个 block 的大小为 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();
}
这只是一个提示,因为我不知道您将如何处理数据,但您的代码应该如下所示。
关于java - 如何解决 OrmLite 中巨大的 byte[] 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31989961/