Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并发应用程序中的PreparedStatement批更新_Java_Sql_Prepared Statement - Fatal编程技术网

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

Java 并发应用程序中的PreparedStatement批更新,java,sql,prepared-statement,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 success

我有两种方法方法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批处理函数,表示我希望一次更新50个事务,而不是逐个更新。我希望在方法A上创建一些计数器(但由于并发线程运行 立即使用此方法,这是可能的吗?)或在方法B中(但当被不同的并发线程调用时,计数器变量将再次为0,这是可能的吗?)或创建一个全局计数器类,以便每次调用方法B()时,此计数器都会增加,一旦达到50,则执行批更新(不知道)

请告知

我想这样做:

让方法A做他想做的任何事情,但将更改、arrayList、Vector等存储到本地缓冲区中。在某一点上,在java端存储更改时应该是一个同步块或一个方法。 在synchronized block(同步块)中,您将增加转换器的计数器,或检查集合大小。如果大于预定义值,则:

  • 阻止A的所有操作,直到B正在收集、构建他需要做的数据
  • 通过B进行批量数据库修改
  • 清空您的收藏,重置计数器
  • 取消阻止所有A方法
老实说,我根本不会这么做

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


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

您的意思是说在方法a()中,我将用户ID存储在ArrayList中,如果此ArrayList大小大于50,则调用方法b()??@MadanMadan yes,在实现缓存以进行更新,在B中进行更新和清理cache@MadanMadan如果你没有按照我建议的100%实施,你能给我一些适合我要求的参考资料吗?这是一个高级问题,这就是我投票的原因。我给出了一个解决方案,高级开发人员可以理解并轻松实现。向同事展示此答案,以便正确实施。我懒得白白写代码……你能给我一些关于批处理计数器的建议吗?我可以写条件,比如if(batch%100==0),然后executeBatch,然后如果批处理中仍然保留了任何内容,executeBatchA简单的方法可以是让方法A处理账单列表。它应该使用单个事务来处理它们,并在最后调用方法B(仍然使用相同的事务)来更新数据库中的状态。您的批处理控制器可以按照自己的意愿工作(可能只需遍历查询的结果集,将每个查询放入一个列表,当列表达到大小X时,调用a,刷新列表),它只需要将多个账单以适当的块形式发送给方法a,以利用批处理。在方法a中,不执行db事务。。只有方法B。