2011-05-13 110 views
0

我使用伯克利數據庫....開放數據庫管理處理

在這種類型的數據庫

通常你打開哪個是一堆文件來控制鎖定和交易等的環境,然後你在這個打開數據庫環境...

的問題是,有數據庫打開地段....
打開一個數據庫的方法是opendatabase()
但是打開和關閉數據庫總是很慢...文檔說

打開數據庫是一種相對昂貴 操作和維護一個 組開放的數據庫通常是 優選反覆地打開和關閉 數據庫中爲每個新 查詢。

的問題是如何保持這種集??????
一個簡單的解決方案,我認爲是懶加載

private static Database db; 
    public CustomerDAO() { 
      if (db == null) { 
       try { 
        DatabaseConfig dbConfig = new DatabaseConfig(); 
        dbConfig.setAllowCreate(true); 
        dbConfig.setType(DatabaseType.BTREE); 
        db = BDBEnvironment.DEFAULT.getEnvironment().openDatabase(null, "C:\\xxxx\\CUSTOMERS", 
          null, dbConfig); 

但是這與雙重檢查鎖定問題..右???
另一個問題是,我想有一個默認的文件名或用戶指定的一個..當然很容易創建的DatabaseManager但總是會出現雙重檢查鎖定問題。
任何想法如何維護一組數據庫句柄?

回答

2

使用基本的Java同步技術和線程安全的數據結構,如ConcurrentHashMap來存儲您的數據庫句柄。如果你還沒有,你應該閱讀this book,因爲它涵蓋了很多你需要的這類問題。

+0

感謝本書:)但是現在我該怎麼辦? ConcurrentHashMap是線程安全的,但處理創建?什麼時候該發生? – GorillaApe 2011-05-13 01:37:34

+0

只要以線程安全的方式完成,延遲加載就可以。或者,創建一箇中央初始化例程,它可以提前打開所有需要的數據庫。它們之間的選擇取決於您的應用程序的需求。你也應該考慮到,雖然Oracle/Sleepycat說它是「昂貴的」,但BerkeleyDB非常快,你應該至少測量在考慮任何其他方法之前一次打開所有數據庫需要多長時間。它可能會變得完全可以接受您的需求,只需將它們全部打開並完成即可。 – 2011-05-13 01:44:16