2

我有两种方法方法 A 和方法 B。方法 A 负责向用户发送账单,方法 B 负责更新数据库。方法 B 使用 PreparedStatement。方法 A 一次由不同的并发线程运行。例如

Thread 1- Method A
Thread 2- Method A
Thread 3- Method A

方法 A 调用方法 B 来更新数据库的计费失败或成功。就像

void A()
{
  send billing sms
 if (successful)
  {
   //update database with successful status
   status='success'
  }

 if unsuccessful{
 status='unsuccess'
  }
  method B(status, connection);

  }

 void B(Status s, Connection con)
  {

   PreparedStatement codes.. for update 

   }

由于方法 A 一次由不同的并发线程调用,我如何在方法 B 中实现 PreparedStatement Batch 函数说我想一次更新 50 个事务而不是一个一个地更新。我想要在方法 A 上创建一些计数器(但由于并发线程一次运行此方法,这可能吗?)或在方法 B 中(但是当不同的并发线程调用时,计数器变量将再次为 0,所以这可能吗?)或者制作一个全局计数器类,以便每次调用方法 B () 时都会增加这个计数器,一旦达到 50,就会执行批量更新(不知道)。

请指教!!

4

2 回答 2

1

老实说,我根本不会这样做。

应该处理由于某种原因导致数据库更新失败的可能性,如果您批量更新完全不相关的账单,您就不能这样做。如果在您的批次中有待处理的更新时服务器关闭,您的方法也很有可能完全错过数据库更新。

一种更简洁的方法是在一次交易中处理多个账单。根据用例,这可能是合适的(批处理),也可能是完全不切实际的(如果它是用户驱动的操作)。

于 2013-05-29T11:44:08.317 回答
0

我会这样做:

让方法 A 做他想做的任何事情,但将其存储到本地缓冲区中,无论您需要什么更改、arrayList、Vector。在某个时刻 - 在 java 端存储更改应该是同步块或方法。在同步块中,您将增加一个转换器计数器,或检查您的集合大小。如果大于预定义值:

  • 阻止 A 的所有操作,直到 B 收集、构建他需要做的数据。
  • 通过 B 进行批量数据库修改
  • 清空你的收藏,重置计数器
  • 解锁所有 A 方法。
于 2013-05-29T10:20:43.393 回答