使用Hibernate和MaxDB的大型结果集

时间:2012-06-22 15:23:50

标签: database hibernate relational-database sap

我需要将一个大型XML文件(包含600个按ID排序的记录)与SAP MaxDB数据库表同步。

这是我目前的策略:

  • 从文件中读取XML对象并转换为Java bean
  • 使用数据库中的相同主键加载对象(见下文)
  • 如果对象不存在,请插入对象
  • 如果对象存在且已更改,则更新对象
  • 在流程结束时,扫描数据库表中未包含在文件中的(已删除)对象

出于效率原因,“加载数据库对象”方法保留下一个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异常“结果表空间耗尽”。

  • 如何更好地优化流程?
  • 如何避免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

0 个答案:

没有答案