JavaJDBC-timeout
JavaJDBC-timeout
在Oracle JDBC執行SQL有幾個設定timeout的方法,提供參考。
Connection pool:
import org.apache.tomcat.jdbc.pool.DataSource;
DataSource datasource = new DataSource();
// 是否檢查借出未歸還的連線
datasource.setRemoveAbandoned(true);
// 借出未歸還的連線到多久的時候中斷
datasource.setRemoveAbandonedTimeout(120);
// 多久檢查一次借出未歸還的連線,所以這個案例最糟狀況可能是(120+60)秒
datasource.setTimeBetweenEvictionRunsMillis(60 * 1000);
- 當程式從pool要求connection時開始計算,超過秒數時,pool會強制中斷連線,並從pool移除,
等隨後對conn做操作時,會拋出java.sql.SQLException: Connection has already been closed的例外 - 避免當程式忘記關connection時,資源可以被釋放
- 避免當DB連線異常時,connection持續被鎖住
- 因為是強制中斷,所以無法rollback跟commit,執行結果可能不如預期
getWriteConnection(int timeout):
藉由timeout這個參數可以覆寫預設在connection pool內的abandonedTimeout時間,
藉此,當我們在執行一些需要大量時間的函數時,可以避免連線被connection pool中斷
setQueryTimeout(int timeout):
在PreparedStatement裡面有一個setQueryTimeout函數,藉此可以指定執行的時間
- 執行超過指定時間,會拋出SQLTimeoutException例外,但connection不會被關閉,也不會從pool移除
- 對時間比較敏感的查詢程式,例如cache的更新,可以設定一個執行時間,超過預期時,可以查找另一個node
- 對比較依賴最後更新時間的table,可以避免執行時間過長,導致cache沒抓到資料