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

时间:2012-07-17 21:19:14

标签: 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

其中given_id和givendate关系在表格和id上都有所不同。

实际删除条件并不总是日期&lt; givendate,我刚才写的,所以说一个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时,它根本不忙吗?我希望它应该是。

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

4 个答案:

答案 0 :(得分:2)

如果对给定的id删除了所有操作,我只会在每个表上删除一次所有ID。

e.g。

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

如果有很多given_ids,则首先将它们插入临时表中,然后通过连接表来执行每次删除以删除临时表

此外,如果尝试使用多个线程,那么只有在线程中的表上执行操作才能实现改进,因此数据库中不存在争用。

答案 1 :(得分:1)

忽略您创建的问题......

为什么不使用IN声明?

delete from table1 where date < given_date and id IN (id1, id2, id3, ...)

根据说明进行更新: 根据评论中的解释,我的猜测是你没有好的索引,每个delete语句都会导致表扫描。每个表扫描锁定表,因此数据库一次只能处理一个语句。将dateid列以及where语句的delete子句中使用的任何其他列编入索引。

答案 2 :(得分:0)

根据我的个人经验,我创建了一个类来管理我的查询和与数据库的通信。我使用线程池来管理我的线程,只是让线程调用我的静态数据库管理器。管理器应该有一个同步方法,它在数据库连接上获取lock()。然后,线程将能够访问数据库,并且它们的操作不会相互冲突。

答案 3 :(得分:0)

如果你不关心在一个事务单元中创建所有命令,那么将删除放在它自己的事务中(小的)。