处理许多记录的一般交易问题

时间:2011-03-08 18:17:07

标签: java transactions ibatis

我正在使用一个对我来说很新的代码库,它使用的是iBatis。 我需要更新或添加到现有表,它可能涉及20,000多条记录。 该过程每天运行一次,并在半夜运行。

我从Web服务调用中获取数据。我计划获取数据,然后为每个记录填充一个模型类型对象,并将每个模型类型对象传递给一些方法,该方法将读取对象中的数据,并将数据更新/插入到表中。

示例:

ArrayList records= new ArrayList();
Foo foo= new Foo();
foo.setFirstName("Homer");
foo.setLastName("Simpson");
records.add(foo);
//make more Foo objects, and put in ArrayList.

updateOrInsert(records); //this method then iterates over the list and calls some method that does the updating/inserting

我的主要问题是如何处理所有更新/插入事务。如果在读取所有记录用于更新/插入表之前系统出现故障,我需要知道,所以我可以回到Web服务调用,并在系统正常时再试一次。

我使用的是Java 1.4,而db是Oracle。

1 个答案:

答案 0 :(得分:0)

我强烈建议您考虑使用春季批次 - http://static.springsource.org/spring-batch/

该框架提供了批处理所需的许多基本功能 - 错误报告,事务管理,多线程,缩放,输入验证。

该框架设计精良,易于使用。

您列出的方法可能效果不佳,因为您正在等待读取所有对象,将它们全部存储在内存中,然后插入数据库中。

您可能需要考虑按如下方式设计流程:

  1. 创建一个能够存储200个对象的缓存
  2. 调用webservice以获取数据
  3. 创建对象的实例,验证并将数据存储在对象的字段中
  4. 将对象添加到缓存中。
  5. 当缓存已满时,执行缓存中对象到数据库的批量提交
  6. 继续第1步
  7. SpringBatch将允许您执行批量提交,控制批量提交的大小,在读取输入时执行错误处理 - 在您的情况下重试请求,在将数据写入数据库时​​执行错误处理。

    看看它。