管理Java中的Notes、Domino後臺對象

熟悉Domino/Notes開發的朋友應該都知道Notes.jar。Notes.jar爲我們提供了一整套的Java API,幫助我們訪問、操縱Domino/Notes後臺中的對象。包括Database,View,Document,ACL等等。Java程序員可以很方便的在Agent,XPages或者獨立Java程序中使用這些API來訪問後臺對象,實現新功能或者和第三方系統進行整合。不過,在使用這些對象的過程中,我們需要注意管理好這些對象的生存週期,否則,這些對象將在不知不覺中,佔用大量的後臺資源。

由於Java天生帶有的垃圾回收機制,Java程序員往往對Java對象的回收並不需要過多關心。當我們不需要某個對象之後,我們只需要把對應的對象應用設置爲NULL,之後Java的垃圾回收機制會在”適當的“時候回收對象所佔用的內存。不過,這一機制對Domino後臺對象並不適用,除了內存空間之外,Domino後臺對象還佔用了相應的後臺資源,Java的垃圾回收將無法知道何時”必須“回收這些資源,因此其回收是不及時的。我們無法依賴Java的垃圾回收來有效管理後臺資源。對於Domino Java對象的管理,我們有一些必須要注意的原則。

圖一 Domino對象間的包含關係
圖像

  • 規則一:每一個Domino對象都需要被釋放。每一個Domino對象類都有一個方法叫recycle(),我們可以通過顯示調用對象的recycle對象以釋放我們不再需要的Domino對象。
  • 規則二:每一個Domino對象在釋放時,都會自動釋放他所包含的對象。比如我們通過Document獲取的Item和RichTextItem對象,會隨着Document的釋放而釋放。而Session對象釋放時,我們獲得的Database、View、Document對象都會被自動釋放。因此:
    • 子規則一:當我們還需要使用某個子對象時,我們必須注意保證其父容器對象沒有超出其作用域。
    • 子規則二:當我們需要訪問某容器的少數子對象時,我們可以通過釋放容器對象隱性釋放子對象;當我們需要在循環中訪問很多個子對象或者容器類需要長期存在時,我們需要在使用完畢後顯式的釋放每一個子對象。
  • 規則三:儘快釋放不需再使用的對象。
  • 規則四:DateTime和Name對象直接包含在Session對象中,因此我們在使用完畢後必須立即主動釋放。對於DataTime,我們可以調用ViewEntry、Document等對象的setPreferJavaDates()方法來要求返回Java的Data對象,以替代Domino的Datatime對象。

在我們書寫代碼的時候,也需要注意迴避Java的垃圾回收機制。比如:

例一:
不合適的寫法:
document = null;
正確的寫法:
document.recycle();

例二:
不合適的寫法:
view=viewNavigator.getNext(view);
正確的寫法:
tmpView = viewNavigator.getNext(view);
view.recycle();
view = tmpView;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章