并发应用程序中的PreparedStatement批量更新

时间:2013-05-29 10:11:49

标签: java sql prepared-statement

我有方法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,则执行批量更新(不知道)..

请指教!!

2 个答案:

答案 0 :(得分:1)

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

如果服务器在批处理中有挂起的更新时关闭,那么您的方法也很有可能完全错过数据库更新。

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

答案 1 :(得分:0)

我会这样做:

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

  • 阻止A的所有操作,直到B收集,构建数据他需要做什么。
  • 通过B
  • 进行批量数据库修改
  • 清空你的收藏,重置计数器
  • 取消阻止所有A方法。