【问题标题】:How to run progress bar while executing the mysql query in java?在java中执行mysql查询时如何运行进度条?
【发布时间】:2014-09-30 22:05:17
【问题描述】:

我想删除我的数据库表中的重复记录,我在 java 中使用这个查询来做到这一点

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"

问题是当我的数据库表中有这么多记录时,这个过程会花费很长时间,并且使我的程序看起来没有运行。

我想使用进度条来显示执行进度,我该怎么做?我现在没有最大值和最小值,那我如何访问进度条?。

【问题讨论】:

  • 我建议等待吧
  • 等待吧?我如何在java中使用它?
  • 看看@Uwe plonus 答案。实际上正确的名称是中间进度条。你无法显示完成了多少百分比,你所能做的就是显示进度仍在进行中

标签: java mysql progress-bar


【解决方案1】:

您可以通过将属性 indeterminate 设置为 true 来创建不确定的进度条:JProgressBar.html#setIndeterminate()

此外,明智的做法是不要在 EDT 中执行长时间的工作,而是为此使用不同的线程。

【讨论】:

  • 请注意,除非他将 sql 放在另一个线程上,否则不确定的进度条将不起作用。
  • 这是正确答案。不可能显示正常的进度条。只有可能的事情是显示进度正在发生
【解决方案2】:

问题是您正在 EDT 上完成所有工作,这会阻塞您的 GUI。您需要在另一个线程上进行加载,这样您的 GUI 仍然可以更新、显示和响应用户输入。

一旦您在另一个线程上工作,然后从该线程,您可以使用 SwingUtilities.invokeLater() 方法将更新发布到 EDT。

您还可以查看 SwingWorker 类,它会为您处理其中的一些。

推荐阅读:http://docs.oracle.com/javase/tutorial/uiswing/concurrency/

【讨论】:

  • 我用的是swing worker,其实我的程序不是堆栈的,我可以用它做任何事情,我想用进度条来显示执行的过程。
【解决方案3】:

很好的问题。

Jenkins 使用上次构建的时间来猜测当前构建需要多长时间才能运行。因此,例如,如果上次构建运行需要 10 分钟,而当前构建是 5 分钟,它将显示它已完成 50%。

你可以做类似的事情。也许先查询数据库,看看有多少项目需要删除,并有一张表,说明要删除的项目数量需要多长时间以及表中有多少项目。

【讨论】:

  • 是的,我是这么想的,但是要更新进度条值,我认为我需要将发布放入循环中,但是在执行查询时我没有循环,那怎么办?
  • 为此使用线程。一个线程将运行 DELETE,另一个线程将管理进度条。当 DELETE 线程完成时,它将更新两个线程之间的共享对象,以让进度条线程知道它已完成。在 Java 中使用它提供的各种并发类和方法很容易做到这一点。
  • 我不知道该怎么做:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多