copyIn()
別のスレッドでメソッドを呼び出して開始されたコピー処理をキャンセルする方法はありますか?
たとえば、コピーする必要があるcsvファイルのリストがあり、データベースサーバーの能力を最大限に引き出します。そのため、n 個のファイルに対して n 個のスレッド接続を作成しますが、たとえば間違ったファイルが選択された場合などに、単一の操作を中止する方法が見つかりません。
スレッドの強制終了は機能しません - COPY は実行を続けるだけです。
このFutureTask<>
クラスはスレッドの作成に使用されるため、スレッドのリストがあります (csv ごとに 1 つ)。
呼び出しtask.cancel(true)
は、サーバー上のプロセスのコピーに関しては何もしません。System.exit()
火でしか倒せない。
何か案は?
私のコードの一部:
Uploader.java implements Callable
public static long uploadFile(final File file, final String tableName) {
long status = 0;
try {
CopyManager copyManager =
new CopyManager((BaseConnection) new DataSource().connect());
FileReader reader = new FileReader(file);
status = copyManager.copyIn(sql, reader);
} catch (SQLException | IOException e) {
...
}
return status;
}
@Override
public Long call() throws Exception {
return uploadFile(file, tableName);
}
Upload files method body
for (File file : files) {
FutureTask<Long> ftask =
new FutureTask<>(
new Uploader(defaultTableName, file)
);
tasks.add(ftask);
execService.execute(ftask);
}
解決済み:
解決策は見つかりましたが、コードにいくつかの変更が必要でした。
Upload files method body
今はこんな感じ
for (File file : files) {
Uploader uploader = new Uploader(defaultTableName, file);
uploaders.add(uploader);
Future<Long> f = execService.submit(uploader);
//save the Future to get the copy result when finished
}
Uploader
これにより、データベース接続を閉じて例外を適切に処理できるsome のメソッドを簡単に呼び出すことができます。サーバーでのコピーが停止します。
このソリューションが最も洗練されたものではないかもしれないことは承知していますが、機能し、高速であり、多くのコードは必要ありません。