2011-05-13 60 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