2011-03-08 33 views
1

我正在处理一个对我来说很陌生的代码库,它使用了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。

回答

0

我会强烈建议您考虑使用Spring Batch的 - http://static.springsource.org/spring-batch/

框架提供大量的批量处理所需的基本特征 - 错误报告,交易管理,多线程,缩放,输入验证。

这个框架设计得非常好,而且非常容易使用。

由于您正在等待读取所有对象,将它们全部存储在内存中,然后插入到数据库中,您列出的方法可能无法很好地执行。

你可能要考虑设计过程如下:

  1. 创建能够存储200个对象
  2. 调用Web服务来获取数据
  3. 创建一个对象实例的高速缓存,验证并将数据存储在对象的字段中
  4. 将对象添加到缓存中。
  5. 当缓存已满,执行批提交在缓存中的对象的数据库
  6. 继续执行步骤1

SpringBatch将允许你进行批量提交,控制批量大小提交时,在读取输入时执行错误处理 - 在您的情况下重试请求,在将数据写入数据库时​​执行错误处理。

看看它。

+0

我不允许使用除我拥有的东西以外的任何东西,它基本上只是Java 1.4。您概述的步骤很有帮助,您是否介意评论我将如何使用交易? – bmw0128 2011-03-09 17:26:07

+0

如果你不允许使用1.4以外的其他东西,那么你将不得不自己做tx管理。 – sdc 2011-03-09 19:31:48

+0

抓取连接,将autocommit设置为false,执行批量插入,当完成所有记录时,执行显式提交 – sdc 2011-03-09 19:32:33