生產環境常需定時觸發數據庫存儲過程(如每日統計、數據清理)。本文提供基於 java.util.Timer 的完整實現,涵蓋延遲計算、連接管理、異常處理、資源釋放,代碼可直接落地。
PROCEDURE proc_gps_analyse (p_date IN DATE); -- 參數為執行日期
public class GpsAnalyseSchedule {
private Timer timer = null;
public GpsAnalyseSchedule() {
// 計算首次執行延遲(如 19:04:10)
long delay = FormatDate.getDateDiff("19:04:10");
timer = new Timer(true); // 守護線程,JVM 退出自動結束
timer.schedule(new GpsAnalyse(), delay, 1000 * 60 * 60 * 24); // 每 24 小時
}
class GpsAnalyse extends TimerTask {
public void run() {
ServerConfig.logger.info("啟動 GPS 運營統計定時任務");
Database db = null;
try {
db = new Database();
CallableStatement proc = db.getConn().prepareCall(
"{ call njtjgps.proc_gps_analyse(?) }");
// 綁定當前日期(去除時間分量)
proc.setDate(1, new java.sql.Date(Calendar.getInstance().getTime().getTime()));
proc.execute();
} catch (Exception e) {
e.printStackTrace();
ServerConfig.logger.error(e.getMessage(), e);
} finally {
if (db != null) db.cleanup(); // 確保連接歸還池
}
ServerConfig.logger.info("GPS 運營統計定時任務完成");
}
}
}
// 啟動入口
new GpsAnalyseSchedule();
| 要點 | 說明 |
|---|---|
| Timer(true) | 守護線程,不阻塞 JVM 關閉 |
| delay 計算 | 首次執行對齊業務時間窗口(如每晚 19:04) |
| period = 24h | 固定頻率調度,簡單場景足夠;複雜調度建議 Quartz/Spring Task |
| CallableStatement | 標準 JDBC 調用存儲過程接口,{call ...(?)} 語法 |
| setDate + Calendar | 傳入純日期,避免時區/時間分量干擾 |
| finally 清理 | 連接、語句、結果集三件套必釋放,防洩漏 |
| 異常日誌 | 記錄堆棧 + 業務日誌,便於事後追蹤 |
njtjgps.),配置化注入。