我在試圖瞭解如何確保特定操作在一定時間內完成。對於Java新的util.concurrent庫看起來像一個簡單的工作。但是,此任務聲明與數據庫的連接,我想確保它在超時後正確釋放該連接。關於FutureTask,最後和Java中的TimeoutExceptions
這樣調用服務:
int resultCount = -1;
ExecutorService executor = null;
try {
executor = Executors.newSingleThreadExecutor();
FutureTask<Integer> task = new CopyTask<Integer>();
executor.execute(task);
try {
resultCount = task.get(2, TimeUnit.MINUTES);
} catch (Exception e) {
LOGGER.fatal("Migrate Events job crashed.", e);
task.cancel(true);
return;
}
} finally {
if (executor != null) {
executor.shutdown();
}
本身只是一個wrapps可調用的任務,這裏是調用方法:
@Override
public Integer call() throws Exception {
Session session = null;
try {
session = getSession();
... execute sql against sesssion ...
}
} finally {
if (session != null) {
session.release();
}
}
}
所以,我對於那些誰找到了這個問題很遠,是:是否在由於TimeoutException導致任務失敗的情況下調用session.release()方法?我假設它不是,但我希望被證明是錯誤的。
感謝
編輯:我遇到的問題是,偶爾有問題的SQL是沒有完成,由於奇怪的分貝問題。所以,我想要做的只是關閉連接,讓數據庫回滾事務,休息一下,稍後重新嘗試。所以我把這個(......)對待,就好像它殺死了那個人一樣。那是錯的嗎?
謝謝這是一個很好的評論。我沒有考慮利用連接超時的事件。 謝謝 – 2009-09-25 17:36:08