具體**如下:
procedurethread_chargecontrollerintf.execute;
begin
ifnot preprarework then
exit;
while
not fstop do
trydowork;
sleep(
1000
); keepdbconnection;
except
on e:exception
dotry
addlog_fromthread(
'thread_chargecontrollerintf執行出錯:
'+e.message);
except
end;
end;
end;
procedurethread_chargecontrollerintf.keepdbconnection;
begin
//防止 gettickcount函式重新計數
if self.flastkeeptick > gettickcount() then
flastkeeptick := 0;
//每小時執行一次
if gettickcount() - flastkeeptick < 3600*1000
then
exit;
flastkeeptick :=gettickcount();
ufunc.threadquery(
'select 1');
addlog_fromthread(
'keepdbconnection.');
end;
該執行緒通過呼叫keepdbconnection函式,達到每小時訪問一次mysql資料庫,以保持資料庫連線不被
dbms
中斷的目的。
其中,flastkeeptick 為integer類變數,儲存上次執行資料庫查詢的時間。
該段**以前正常執行,每小時執行一次。但最近卻突然發現,變為每秒執行一次。
日誌如下:
2021-01-20 08:40:38 keepdbconnection.2021-01-20 08:40:39 keepdbconnection.
2021-01-20 08:40:40 keepdbconnection.
2021-01-20 08:40:41 keepdbconnection.
2021-01-20 08:40:42 keepdbconnection.
**跟蹤發現,flastkeeptick在儲存gettickcount()返回的數值時,沒有如想象中為正整數,而是變為了負值。如:
2021-01-20 08:42:04 flastkeeptick=-18329241072021-01-20 08:42:04 gettickcount=2462044189
可見,flastkeeptick在儲存時,並不是存為2462044189,因為該值已經超出integer的範圍,導致其存為相應的負值,即 2462044189- 4294967296(256*256*256*256) =-1832924107
找到原因,解決問題很簡單,就是要將flastkeeptick宣告為dword型別,而不是
integer
型別,而且gettickcount函式的返回型別本來就是dword型別。
實測將flastkeeptick宣告為dword型別後,程式恢復正常,問題解決。
mysql 字段型別不一致導致索引失效
近日,線上發現一條查詢效率很低的sql 還好只是試執行,不然要涼涼了 sql也比較簡單,就是查詢部門,順便關聯了部門的所屬行政區劃,紅色的子查詢是這次的查詢較慢的原因 使用explain 分析sql可以看到,對於md administrative region表是進行了全表的掃瞄 type all ...
導致資料庫中資料不一致的原因
1 牛客網原題 2 參考資料 資料庫中有可能會存在不一致的資料。造成資料不一致的原因主要有 如果資料庫中存在冗餘資料,比如兩張表中都儲存了使用者的位址,在使用者的位址發生改變時,如果只更新了一張表中的資料,那麼這兩張表中就有了不一致的資料。比如某個訂票系統中,兩個使用者在同一時間訂同一張票,如果併發...
ajax跨域導致sessionId不一致
網上有很多方法,大部分相同,也是有用的,只是我被折磨了好幾天,竟是chrome瀏覽器同一視窗每次請求sessionid不同問題。也就是ajax跨域導致sessionid不一致我解決啦,但是我忘了chrome設定的問題,結果一直卡在這。所有分兩步 1.先解決chrome瀏覽器同一視窗每次請求sessi...