Java多线程删除同组表

标签 java sql-server multithreading sql-delete

我必须清理数据库(少数具有给定条件的表,其中条件列始终相同)例如

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

其中给定的 ID 和给定的日期关系在表与表之间以及 ID 与 ID 之间都有所不同。

实际的删除条件并不总是 where date <给定日期 ,我只是举个例子,假设一个id有300天的数据,另一个有500天的数据,where条件允许删除oldes 10天数据的数量,其中 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个线程,它们都会一个接一个地启动,并且显然运行在同一套表。并且 sql 实际上并未在每个表上并行执行?

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

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

最佳答案

如果所有操作都在给定 id 上删除,我只需对每个表执行一次删除操作,同时执行所有 id。

例如

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

如果有很多给定的_id,首先将它们插入临时表,然后通过连接表以与临时表进行删除来执行每个删除

此外,如果尝试使用多个线程,那么只有在线程中对表进行操作时才可以真正实现改进,这样数据库中就不会出现争用。

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

相关文章:

java - Android - 套接字超时

java - 使用 getFilesDir() 时应用程序上下文返回 null

sql - 计算组百分比到小数点后 2 位 - SQL

C# 锁定在锁定 block 中重新分配的对象

Android:我应该使用什么来运行后台长期 Activity ?

java - 在 Fragment 中带有图像和文本的 Android ListView

java - 将短整数附加到 CodedOutputStream 的干净方法

sql - 无法对 SQL Server 中的所有行应用计算

sql - 数据库结构反馈

c# - 无法将元组添加到 BlockingCollection : Error CS1503 in C#