2017-08-24 109 views
0

我的代碼中的以下語句永遠不會完成執行。我不確定,如果下面的查詢出錯了。JDBCTemplate基於時間刪除記錄,永不完成

 public void delete(String username) { 
     LocalDateTime sixMonthsOld = LocalDateTime.now().minusMonths(6); 
     this.jdbcTemplate.update("delete from log_access where accesstime <= ?", Timestamp.valueOf(sixMonthsOld)); 
     } 

但是當我嘗試其他的查詢,它

public void delete() { 
    this.jdbcTemplate.update("delete from log_access where username <= ?", "aaa");  

    } 

有幾乎50到100條記錄在DB工作正常。不知道爲什麼隨着時間的刪除查詢需要很長時間。

+0

採取一個線程轉儲,看看爲什麼它掛起。可能沒有免費連接,或者只有很多數據需要刪除。 –

+0

@ M.Deinum。它是非常非常小的數據,並且有很多免費線程 – Patan

+2

或者刪除語句與另一個事務發生衝突,並且正在等待鎖定 –

回答

0

我想這是因爲大量的數據被刪除,所以你得到超時或回滾段太小,以保持這麼多的記錄。 將刪除拆分爲一組較小的。

public void delete(String username) { 
    LocalDateTime sixMonthsOld = LocalDateTime.now().minusMonths(6); 
    for (int i=0; i<maxIdInTheLogAccesstable; i+=1000) { 
     this.jdbcTemplate.update("delete from log_access where accesstime <= ? and id<?", Timestamp.valueOf(sixMonthsOld), i); 
    } 
    } 

因此,您將逐步刪除。 Id範圍1000可以修改爲10k或更多,具體取決於您的實際最大ID和數據量以及服務器。