【发布时间】:2012-02-15 20:46:54
【问题描述】:
我最近使用 Quartz 调度程序来运行一些涉及数据库访问的后台进程(例如报告生成)。现在,这个后台任务在单独的线程中运行。但是,数据库访问是在我的应用程序的中心点完成的,类似于
System.err.println("CURRENT THREAD: "+ Thread.currentThread().getName());
在执行实际查询之前打印“main”。因此,我认为数据库读取是由 UI 线程(“主”线程)完成的。 UI 失去(部分)响应能力这一事实也证实了这一点。如果可能的话,我想要做的是在单独的线程中运行每个数据库访问,以便可以在查询请求中实现一个取消按钮,如果这将成为必要的话。所以,我想象有这样的工人:
-
UI线程:负责UI;
-
数据库访问线程:负责从数据库中取回数据;
-
计划的后台任务:负责其他所有事情(并使用数据库访问线程)。
这可以实现吗?或者,有没有比我的方法更好的替代方法?
附:在这一点上,我不想使用一些现有的框架来解决这个问题(Hibernate、Spring 等)。我只需要一个自制的、可行的解决方案。
堆栈跟踪:
at com.mycompany.myproduct.core.db.SQL.executeQuery(SQL.java:260)
at com.mycompany.myproduct.core.db.Database.getAbstractDBObjects(Database.java:285)
at com.mycompany.myproduct.core.db.Database.getAbstractDBObjects(Database.java:305)
at com.mycompany.myproduct.core.util.job.DummyJobProcessor$1.run(DummyJobProcessor.java:61)
at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at com.mycompany.myproduct.core.ui.layers.AbstractView.open(AbstractView.java:915)
at com.mycompany.myproduct.mycompany.open(mycompany.java:196)
at com.mycompany.myproduct.mycompany.main(mycompany.java:365)
【问题讨论】:
-
阅读您的问题后,您似乎想从不同的线程运行数据库访问,这样您的 UI 就不会受到影响。我说的对吗?
标签: java mysql multithreading user-interface quartz-scheduler