2014-09-30 141 views
1

我想刪除重複記錄在我的數據庫表,我這樣做是在Java中使用此查詢如何在java中執行mysql查詢時運行進度條?

String sql = "DELETE e1 FROM tweet_after_preprocessing e1, tweet_after_preprocessing e2 WHERE e1.tweet = e2.tweet AND e1.tweet_after_preprocessing_id > e2.tweet_after_preprocessing_id" 

問題是,當有在我的數據庫表中,以便多條記錄,該過程將需要很長時間,並使我的程序看起來不正常運行。

我想用進度條顯示執行進度,我該怎麼做?我現在沒有最大值和最小值,所以我如何訪問進度條?

+0

我建議等待吧 – 2014-09-30 13:59:10

+0

等吧?我如何在java中使用它? – 2014-09-30 14:01:09

+0

看@Uwe plonus答案。實際上正確的名字是中級進度條。你不能顯示多少persentage完成和多少剩下所有你能做的是顯示進度仍在發生 – 2014-09-30 14:13:34

回答

1

問題是,您正在美國東部時間做所有的工作,這阻礙了您的GUI。您需要在另一個線程上進行加載,因此您的GUI仍然可以更新,顯示並響應用戶輸入。

一旦你在另一個線程上工作,那麼你可以使用SwingUtilities.invokeLater()方法在該線程中發佈更新到EDT。

你也可以看看SwingWorker類,它爲你處理了一些。

推薦閱讀:JProgressBar.html#setIndeterminate()http://docs.oracle.com/javase/tutorial/uiswing/concurrency/

+0

我使用了swing工作,實際上我的程序不是堆棧,我可以用它做任何事情,我想用進度條來顯示執行過程。 – 2014-09-30 14:08:53

2

您可以通過設置屬性不確定的爲true創建一個不確定的進度條。

另外明智的做法是不在EDT中執行長期的工作,但使用不同的線程。

+0

請注意,除非他將sql放在另一個線程上,否則不確定的進度欄將不起作用。 – 2014-09-30 14:06:33

+0

這是正確的答案。它不可能顯示正常進度條。唯一可能的事情是顯示進度正在發生 – 2014-09-30 14:09:17

0

優秀的問題。

Jenkins使用最後一次構建的時間來猜測當前構建運行需要多長時間。例如,如果最後一次構建運行需要10分鐘,並且在當前構建中需要5分鐘,則會顯示它已完成50%。

你可以做類似的事情。可能首先查詢數據庫,看看有多少項目需要刪除,並且有一個表格,說明要刪除的項目數量以及表格中的項目數量。

+0

雅我想這樣,但更新進度欄的價值,我認爲我需要把發佈在循環中,但我如何在執行查詢時沒有循環,那麼如何? – 2014-09-30 14:12:19

+0

爲此使用線程。一個線程將運行DELETE,另一個線程將管理進度條。 DELETE線程完成後,它將更新兩個線程之間的共享對象,以使進度條線程知道它已完成。在Java中使用它提供的各種併發類和方法很容易。 – 2014-09-30 14:15:53

+0

我不知道該怎麼做:( – 2014-09-30 14:31:17