私は最近、データベースアクセスを含むいくつかのバックグラウンドプロセス(レポート生成など)を実行するためにQuartzスケジューラを使用しました。今、このバックグラウンドタスクは別々のスレッドで実行されます。ただし、データベースへのアクセスは、私のアプリケーションで中心点に行われ、実際のクエリを実行する前に、Javaデスクトップ - どのようにUIスレッドからデータベースアクセスを分離するのですか?
System.err.println("CURRENT THREAD: "+ Thread.currentThread().getName());
版画「メイン」、のようなもの。したがって、私は、データベースの読み取りは、UIスレッド( "メイン"スレッド)によって行われると思っています。これはUIが(部分的に)彼の応答性を失うという事実によっても確認される。可能であれば、可能な場合は、別のスレッドですべてのデータベースアクセスを実行し、その結果必要になる場合は、キャンセルボタンをクエリ要求に実装できるようにします。だから、私はこの労働者を持っていると想像します:
- UIスレッド:
- データベースアクセススレッド:dbからデータを取得します。
スケジュールされたバックグラウンドタスク:それ以外はすべて(およびDBアクセススレッドを使用します)。
これは実現できますか?あるいは、私のアプローチに代わるより良い選択肢がありますか?
P.S.私はこの時点で、この問題(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が影響を受けないように、別のスレッドからデータベースへのアクセスを実行しているようです。私は正しい? –
@Sunny Guptaはい。 – hypercube