專案中遇到乙個檢查資料庫資料是否過期,並且如果過期的話需要更新欄位的功能,當時想到的是資料庫的儲存過程+定時實現,後續想著很多方法如果能在後端**實現的話就不用在資料庫新增太多功能,所以嘗試搜了一下springboot這塊是否有這個功能,發現還真有,通過定時任務實現該功能,定時檢查是否過期,如果過期更新字段;如果沒有過期的則不作任何操作。在此進行簡單記錄。
1. mysql event實現:
2. springboot實現:
1.1 事件簡介
事件是mysql在相應的時刻呼叫的過程式資料庫物件。乙個事件可呼叫一次,也可週期性的啟動,由乙個特定的執行緒來管理的,即所謂的「事件排程器」。
事件和觸發器類似,都是在某些事情發生的時候啟動。當資料庫上啟動一條語句的時候,觸發器就啟動了,而事件是根據排程事件來啟動的。由於他們彼此相似,所以事件也稱為臨時性觸發器。
1.2 基本用法 參考
1.2.1 檢視是否開啟定時器
show variables like 'event_scheduler';
1.2.2 開啟mysql定時器
方法一:在my.ini中新增 event_scheduler = on,
方法二:命令列中輸入set global event_scheduler = 1; (1為on;0為off)
show variables like 'event_scheduler'檢視可以看到結果為on
1.2.3 建立事件
定義事件的執行間隔事件
sql預覽
1.2.4 開啟事件
1.2.5 關閉事件
alter event expirejudge on
completion preserve disable;
1.3 測試
開啟事件前:
開啟事件後:(系統當前時間為16:51,所以只要開啟事件就會直接更新兩條字段)
2.1 @scheduled定義定時任務
@component
@service
public class schedulecontroller
//遍歷更新expire=1
for(user user : userlist) : 更新成功,已過期",user.getusername());
}else : 更新失敗",user.getusername());}}
}}
mybatis中進行時間大小判斷可使用cdata標籤,可解析xml解析器解析不了的文字資料
在 xml 元素中,"
cdata 部分中的所有內容都會被解析器忽略。由 "" 結束,
如果遇到特殊字元,將包含sql語句用cdata包裹住即可不被解析器解析
select *
from user
where user.expired=0
and ;
2.2 @eablescheduling開啟定時任務
@enablescheduling //定時器註解
}
2.3 加入並行執行緒機制
/**
* 定時任務的並行實現,目前為3個執行緒
*/@configuration
public class scheduledconfig implements schedulingconfigurer
@bean
public executor settaskexecutors()
}
2.4 測試(每1s執行一次)
2.4.1 未加入並行機制,序列定時結果
2.4.2 加入並行機制,並行定時結果
一般不需要也盡量別對資料庫直接加事務、觸發器、事件等操作(如果是整合的資料庫-後端都有的專案的話),有想法多蒐集資料查一查,邊查邊實踐邊學習邊總結進步~
redis定時過期,清除
我這裡用的是redistemplate控制的redis 可以發現他的put方法 除了key和value 還會放乙個引數進去,就是他的失效時間 redistemplate.opsforvalue set key,value,seconds,timeunit.seconds 只要往redis存值的時候,...
判斷session是否過期
request.getseesion boolean 這個裡面傳了乙個boolean值,這個值如果是true,那麼如果當前的request的session不可用,那麼就建立新的會話,如果存在就返回當前的會話。如果引數是false,那麼在request的當前會話不存在的時候就返回null。這樣就可以很...
判斷session是否過期
前一段時間有好幾個問題,提到怎麼判斷session是否過期。接觸jspo已經很久了,但是還真沒有想過這個問題,當時也就沒有找到乙個滿意的答案給人家。當時,我提到乙個方法,就是實現httpsessionlistener介面,然後在sessiondestroyed 方法中執行一些操作,表示session...