Java 并发应用程序中的PreparedStatement批更新
我有两种方法方法A和方法B。方法A负责向用户发送账单,方法B负责更新数据库。方法B使用PreparedStatement。 方法A一次由不同的并发线程运行。比如说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
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。