說明:resin 用的版本是4.0的
由于需要程式運作時産生一條線程,對特定資料進行處理;
一直以來都運作得很正常,除了程式因為BUG太多緣故,運作一段時間後就會報記憶體溢出錯誤,
一直沒找到真正原因,是以,經常得過段時間就要重新開機resin
某天突然發現資料被重複處理了,生成了重複的記錄,時間點完全一樣;
因為這些資料在處理時會進行排重處理
是以,按照程式的正常處理邏輯是不可能有重複資料的,并且時間點是一樣的,
檢查了很多遍相關代碼就是看不出哪裡會出問題
重新開機resin後,這種現象就又沒有了,有段時間,重複資料特别多,
可能隔1,2天就又會出現這種情況,進行代碼調試也調試不出有這種情況
最後通過跟蹤resin處理日志和程式日志,發現當出現這種情況時,資料被重複生成了,
相關日志資訊都列印了二次,就好像這個線程突然會分身術變成了二個一模一樣的線程了;
但是又想不出是什麼情況下才會讓線程突然分身成2條。
在網上找了很久資料,都沒找到有人說有這種情況;
後來無意間看到一張貼子,說的是resin覆寫class的時候,會重新讀web.xml
而我的線程是放在容器的ini方法裡産生的。
public class ContainerListen implements ServletContextListener {
public void contextDestroyed(ServletContextEvent sce) {
}
public void contextInitialized(ServletContextEvent sce) {
//開啟 實時線程
new SSThread();
}
}
對照産生重複記錄的日期,發現産生重複記錄時我都有修改程式,因為知道resin會自動加載修改的類,
是以修改類傳到伺服器時都沒有重新開機resin,懸了幾個月的問題終于解決了。哎!
參考:http://topic.csdn.net/t/20040628/13/3128123.html
/blockquote