2014-04-16 95 views
2

我使用耶拿創建三店(TDB功能)用下面的代碼後鎖定通過我的應用程序服務器(Glassfish),我不能刪除它們,直到我手動停止Glassfish並釋放它的鎖定。如上面的代碼所示,我想我正在關閉所有內容,所以我不明白爲什麼在文件上保留一個鎖。阿帕奇JENA TDB文件與Web應用程序的創建

回答

3

當你調用Dataset#close(),該implementation代表調用到底層 DatasetGraphBase#close(),然後最終委託給DatasetGraphTDB#_close()

這導致致電TripleTable#close()QuadTable#close()。這兩個電話(幾個)NodeTupleTable#close()。繼續間接地,這呼叫NodeTable#close()TupleTable#close()。前者是一個接口,所以我們需要對你的實現中運行哪個類進行適當的猜測。後者遍歷一系列TupleIndex對象,並在每個對象上調用close()TupleIndex也是一個接口。

只有一個來自TupleIndex的後代有意義的層次結構,導致可以鎖定文件的東西,這導致我們到TupleIndexRecord#close()。然後,我們可以按照具體實現方式RangeIndex稱爲BPlusTree一路下跌,直到我們看到的MappedByteBuffer

最終實際所有權,而閱讀的BlockAccessMapped#close()實施,好像整個層次結構是正確關閉的事情,下至最後一堂課,但那this longstanding bug可能是罪魁禍首。從文檔:

一旦文件已被映射數量上的文件將 失敗,直到映射已被釋放的操作(例如刪除,截取到 尺寸小於映射的區域)。然而程序員不能精確控制 解映射發生的時間---通常是 它取決於終止處理或PhantomReference 隊列。

所以你有它。儘管Jena盡了最大的努力,但仍然無法控制該文件何時以Java取代映射。這最終成爲java中內存映射文件IO的折衷。

+2

特別是如果你在Windows上,那麼取消映射文件是非常不可靠的 – RobV