首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Java Timer 調用 Oracle 存儲過程實戰:定時任務最佳實踐

     編輯:Oracle 資料庫基礎

生產環境常需定時觸發數據庫存儲過程(如每日統計、數據清理)。本文提供基於 java.util.Timer 的完整實現,涵蓋延遲計算、連接管理、異常處理、資源釋放,代碼可直接落地。

一、存儲過程簽名

PROCEDURE proc_gps_analyse (p_date IN DATE);  -- 參數為執行日期

二、完整 Java 實現

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 清理連接、語句、結果集三件套必釋放,防洩漏
異常日誌記錄堆棧 + 業務日誌,便於事後追蹤

四、生產化建議

  • 改用 Spring @Scheduled 或 Quartz:支持 Cron 表達式、集群、失敗重試、監控。
  • 存儲過程參數化:避免硬編碼 Schema 名(njtjgps.),配置化注入。
  • 幂等設計:存儲過程內部支持重複執行不產生副作用(如 MERGE/UPSERT)。
  • 監控告警:任務執行耗時、成功/失敗指標接入 Prometheus/Grafana。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved