我需要将一个大型XML文件(包含600个按ID排序的记录)与SAP MaxDB数据库表同步。
这是我目前的策略:
出于效率原因,“加载数据库对象”方法保留下一个1000条记录的缓存并发出语句以加载下一组对象。它的工作原理如下:
List<?> objects = (List<?>)transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
ht.setMaxResults(BUNCH_SIZE);
ht.setFetchSize(BUNCH_SIZE);
List<?> objects = ht.find("FROM " + simpleName + " WHERE " +
primaryKeyName + " >= ? ORDER BY " + primaryKeyName, primaryValue);
return objects;
}
});
不幸的是,对于BUNCH_SIZE(10,000)的某些常量值,我得到一个SQL异常“结果表空间耗尽”。
保存更改对象的代码如下:
if (prevObject == null) {
ht.execute(new HibernateCallback(){
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
session.save(saveObject);
session.flush();
session.evict(saveObject);
return null;
}
});
newObjects++;
} else {
List<String> changes = ObjectUtil.getChangedProperties(prevObject, currentObject);
if (hasImportantChanges(changes)) {
changedObjects++;
ht.merge(currentObject);
} else
unchangedObjects++;
}
}
虽然这段代码原则上有效,但如果源文件中有很多新的或更改的对象,它会产生大量的数据库日志条目(我们讨论的是50 GB以上的日志备份)。
我非常感谢任何帮助。非常感谢,Matthias