1. 程式人生 > >管理Java中的Notes、Domino後臺物件

管理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;