2012-06-01 58 views
1

我正在開展一項學術研究,嘗試開發一種編程工具來協助實現細粒度的鎖定函數,用於維護樹狀數據結構的併發程序。例如,程序員可以編寫一些接收樹根節點並修改樹(通過遍歷某些路由並添加/刪除節點)的函數,該工具將幫助他找到代碼節點中的哪個部分應該被鎖定以及它們可以被釋放的位置 - 因此這些功能可以在同一棵樹上同時執行。使用細粒度鎖的代碼示例(JCR Jackrabbit?)

我正在尋找一些真實的代碼示例,其中使用了這種細粒度的鎖定,或者它可以用於獲得更好的性能,但程序員卻懶得實現它(例如,他鎖定了整個在函數調用期間不釋放無用的節點)。

我讀到JCR &兔崽子,它使用一個樹狀結構的數據庫,發現解釋瞭如何在JCR鎖定節點(但沒有實例)的一篇文章: http://www.day.com/specs/jcr/2.0/17_Locking.html

我有一個非常小的背景數據庫,我不完全理解什麼是允許的,什麼是不允許的,當涉及到Jackrabbit數據庫和併發。從2個線程訪問相同的節點是不允許的,但不同的儲存庫呢?如果兩個不同的客戶端嘗試訪問同一個節點會發生什麼情況(例如,一個嘗試刪除它,另一個嘗試修改它 - session.save()會失敗嗎?)。

感謝, 奧倫

+0

您也可以在Adobe論壇中查詢CQ5(http://forums.adobe.com/community/digital_marketing_suite/cq5)。 CQ5實施的JCR,被稱爲CRX,是Apache Jackrabbit的商業版本。 –

+0

你想留在JCR的境界嗎?你對其他技術開放嗎? –

+0

Clojure社區對併發性有很多想法,那是它的驅動之一。請參閱http://clojure.org/concurrent_programming - 在許多情況下,暗示在實踐中,程序員在沒有明確使用鎖的情況下創建更好的程序。這就是爲什麼Clojure提供的方法與傳統的Java鎖定有很大不同。如果你願意,我們可以找到很多Clojure代碼示例。 –

回答

1

首先,沒有得到數據庫/兔崽子/鎖定之間的混淆。 Jackrabbit像數據庫一樣實現自己的鎖定。

Jackrabbit允許您使用LockManager.lock()鎖定節點。將isDeep參數設置爲true表示下面的所有節點也將被鎖定。鎖定的節點可以被另一個會話讀取,但無法修改。

從技術上講,2線程可以編輯同一節點,如果他們使用相同的會話,但這是相當危險的,應該可以避免。

如果一個節點可能被兩個併發會話修改,那麼您應該始終鎖定該節點。哪個會話最後到達應等待鎖定被釋放。如果你不鎖定,那麼至少有一個會話會拋出異常。

我不確定您通過訪問來自不同存儲庫的節點意味着什麼。節點只能屬於一個存儲庫。如果你的意思是有2個jackrabbit實例訪問相同的數據庫,那麼這也應該避免,或者你應該看看使用集羣。

實施鎖定時,將取決於您的設計和要求。如果你只有一次會話,反之亦然,沒有任何意義。是否鎖定節點或子樹將取決於數據所代表的內容。例如,如果一個節點代表一個文件夾,您可能只想鎖定該節點而不是整個子樹。如果一個子樹表示一個複雜的文檔,那麼你可能會想要鎖定該子樹。

至於鎖定整棵樹,我希望我不會遇到這樣做的人!

+0

鎖定整個長耳大樹的人被稱爲笨驢。 –