2011-05-16 61 views
2

你好,我是想實現一個數據庫對象(「連接」)用於緩衝池BerkeleyDB的... 我決定用一個單身EJB propably或這個..數據庫普勒

最後concurrenthash ENUM單執行地圖將存儲具有時間戳的數據庫對象...

方法getConnection()將使用雙重檢查鎖定,只要map中的值是易失性的。 - 沒有性能問題,我相信..(Java的連接池的getConnection同步!!)
的數據庫擴展到100個文件+日常的人。(應用七十年代中期1976年設計的)..

到目前爲止一切很好......但我想關閉每日不用的手柄。
所以我決定使用定時器每24小時運行一次清理程序..
問題是,我如何確保在清理過程中要關閉的連接不被請求?
僞算法

cleanup(){ 
     for(Database db in map){ 
     if(db.getLastAccess - now >24hours) { 
       res=map.remove("key",db); 
       db.close(); 
     } 
     } 
    } 

我知道的是,上述心不是線程safe..How可我阻止的getConnection?因爲許多事情可能會出錯......「如果條件」可能是真的但刪除db obj前 getLastAccess可以改變!雖然清理會被單線程調用.. 有沒有解決方法來阻止getconnection以某種方式清理工作或任何其他解決方案?

回答

1

我不確定你現在是否這樣做,但是如果你有辦法確定連接是否在使用中,這可能會稍微容易一些。你可以做的一件事就是遍歷池中的連接。當您找到符合要求的關閉標準時,請嘗試將其標記爲正在使用中(假設正在使用的連接不會作爲開放連接返回)。如果你成功了,關閉它。否則,請檢查它,直到它變爲空閒,並且您可以將其標記爲正在使用。一旦你能夠做到這一點,你應該能夠關閉它。

1

每個連接都會有一個與之關聯的鎖,爲了使getConnection方法返回連接,必須獲取正確的鎖。清理方法還需要在關閉連接之前獲取鎖定。看看java.util.concurrent.lock package

也許Semaphore是一個更好的解決方案。按照鏈接舉例。

我從來沒有使用BerkeleyDB,但我認爲它有一個JDBC接口。您不能使用開箱即用的解決方案,如DBCPc3p0?另外檢查Pool Component,它是一個通用的池接口。

+2

BerkeleyDB不是SQL數據庫,它是一個鍵值存儲,因此它不支持運行SQL查詢。因此,JDBC支持沒有多大意義。 – 2011-05-16 15:20:11

+0

@Robin Green:感謝您的澄清,我之前聽說過這個數據庫,並認爲它是一個嵌入式關係數據庫。所以DBCP和c3p0都沒有了。池組件,可能比從頭開始實施池更好的解決方案。 – iruediger 2011-05-16 16:00:07