gpt4 book ai didi

同一组表上的Java多线程删除

转载 作者:行者123 更新时间:2023-12-03 12:56:33 25 4
gpt4 key购买 nike

我不得不清理数据库(几个给定条件的表,其中条件列总是相同的)例如

delete from table1 where date < given_date1 and id = given_id
delete from table2 where date < given_date2 and id = given_id

其中 given_id 和 givendate 关系因表和 id 不同而异。

实际的删除条件并不总是 where date < givendate ,我只是举个例子,所以说一个 id 有 300 天的数据,其他 500 天的数据, where 条件允许删除 oldes 10 天的数据 where 10 是一个基于用户输入的变量,因此在一次迭代中,所有节点都通过删除最旧的 10 天数据进行处理,因此每个 id 的查询更改,但事实是它将位于相同的表集上

早些时候该脚本是作为 sql 脚本编写的并执行其操作但需要时间,现在我已经实现了一个多线程 java 应用程序,其中新代码看起来像
for(i=0; i < idcount ; i++)
{
//launch new thread and against that thread call
delete(date,currentid);
}

function delete(date,id)
{
delete from table1 where date < given_date and id = given_id
delete from table2 where date < given_date and id = given_id

}

执行此操作后,我发现 sql 表出现死锁,这是通过对表建立索引来解决的,但仍然没有预期的快,如果我有 500 个线程,它们都会一个接一个地启动,并且显然在同一组上运行 table 。并且 sql 实际上并不是在每个表上并行执行?

当我监控我的 java.exe 和 sqlserver.exe 时,它​​根本不忙?我希望它应该是。

谁能告诉我在同一组表上实现多线程删除的最佳方法是什么,以便我可以增加线程并并行删除并消耗可用资源

最佳答案

如果在给定的 id 上删除所有操作,我将在每个表上执行一次删除所有 id 的操作。

例如

delete from table1 where date < given_date and id in (given_id1, given_id2 ..... )

如果有很多 given_ids,首先将它们插入到临时表中,然后通过加入表来执行每个删除操作,以便对临时表进行删除

此外,如果尝试使用多个线程,那么实际上只有在您对线程中的表进行操作时才能预期改进,因此数据库中不会出现争用。

关于同一组表上的Java多线程删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11531031/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com