這周有個項目出現的問題:就是DOMINO在毫無癥狀的情況下突然死機,排查了幾天總算找到了問題所在。由於這類錯誤隱藏在LS中,所以很難查到。希望各位Coding時注意。
環境:(產品,平台,機型,軟體版本,等)
產品:Lotus Notes/Domino
平台:Windows
軟體版本:6.5-7.2
問題描述:
當原數組超出一定數量的元素時,調用Arrayunique 函數會導致Domino伺服器或Notes用戶端宕機。在一個具體客戶的執行個體中,原數組包含4085個元素,並被定義為Variant類型的變數。在7.02以上版本雖然不會造成DOMINO宕機,但會造成HTTP請求進程無法結束,使伺服器CPU始終為100%
具體代碼執行個體:
Dim crashvar As Variant
Dim testsize As Integer
Dim i As Integer
testsize=4086
Redim crashvar(testsize)
For i = 1 To testsize
crashvar(i)="a"
Next
crashvar = Arrayunique(crashvar)
在NSD中,導致宕機的線程以下面的條目開頭:
nnotes.LSsThread::ArrayAllocCopy
nnotes.LSsMathOp::Assignment
解決辦法:將數組定義為一個相對獨特的類型,而不是Variant類型。
例如:
Dim crashvar() As String
Dim testsize As Integer
Dim i As Integer
Dim x As Variant
testsize = 4086
Redim crashvar(testSize)
For i = 0 To testsize
crashvar(i)="a"
Next
x = Arrayunique(crashvar)
建議:在開發中出於效能,記憶體消耗上考慮,盡量少使用或不要使用數組以及Variant資料類型。(不要使用動態數組,因為在小資料範圍內不會造成資料溢出,但在大資料範圍內可能會達到數組上限。)