次のように初期化された Java ThreadPool があります。
ThreadFactory tFactory = new DatabaseWorkerThreadFactory();
final ExecutorService dbService = new ThreadPoolExecutor(1, 5, 10L, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(10), tFactory);
次に、このようにそのスレッドプールで Runnable Task を実行します
executorService.execute(new RunnableDbInsertTask(netData));
これらの挿入を残りのコードから非同期にするため。
ActiveJDBC を ActiveRecord 実装として使用しているため、各ワーカーにアクティブな Connection が必要です。これには、RunnableDbInsertTask
のrun()
メソッドの開始時にこのコードを使用します。
if(!Base.hasConnection())
Base.open(params);
したがって、ThreadPoolExecutor
が使用されると、タスクを取得する新しくスポーンされたそれぞれThread
が一意の接続を持ち、すべての接続でそれを再利用します。
ThreadPoolExecutor's
実行するジョブがない場合 、コンストラクターで指定されているように、スレッド量を最小値 (1) にフォールバックする必要があります。
これが正しく行われるためには、アクティブでないためにスレッドが自動的に終了するときに、ThreadPoolExecutor
ActiveJDBC のBase.close()
メソッドを呼び出す接続を自動終了する必要があります。
解決策として、メソッドをオーバーライドしようとDatabaseWorker.interrupt()
しましたが、うまくいきませんでした。
どんな助けでも感謝します。ありがとう!