警惕程式中資料型別不一致導致錯誤

2022-03-16 19:41:29 字數 1810 閱讀 8854

具體**如下:

procedure

thread_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;

procedure

thread_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=-1832924107

2021-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...