2014-09-30 97 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