dyerac  
dyerac In Java
公告

日历
<2006年12月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
统计
  • 随笔 - 36
  • 文章 - 10
  • 评论 - 94
  • 引用 - 0

导航

常用链接

留言簿(5)

随笔分类(49)

随笔档案(36)

文章分类(11)

文章档案(10)

相册

dyerac

搜索

  •  

积分与排名

  • 积分 - 78570
  • 排名 - 706

最新随笔

最新评论

阅读排行榜

评论排行榜

 
db4o 為一項以java 及 .NET 為主的物件資料庫開源計劃.
應用它能節省開發資金及減少開發時間, 使開發員更專注於business logic,
它尤其適合於沒有DBA的嵌入式設備, 提供這些設備更理想的儲存方案.

db4o 以源生物件儲存, 不像一般的 ORM (object relational mapping)解決方案,
由於它應用物件源始儲存概念 , 故儲存效率比 ORM 更階,  
其速度 與 hibernate + mysql 相差幾個級數比.
以下是官方的測試報告:
http://www.db4o.com/about/productinformation/benchmarks/

db4o 目前被不同的 168 個國家下載超過三十萬次,

開始備忘記:
下載 db4o-5.2-java.zip
http://developer.db4o.com/Files/

解壓後 把下面的 library 加入環境變數 CLASSPATH 裡:
bloat-1.0.jar                    //  這個library 優化執行階段
db4o-5.2-java1.2.jar       //  這個library 相容 jdk 1.2.x 至 1.4.x
db4o-5.2-java5.jar          //  這個library 相容 jdk 5
db4o-5.2-nqopt.jar         //  這個library 優化編譯或執行階段


Account.java

public class Account {    // 這是用來測試的 Account class
private String name;

private String password;

public Account(String name, String password) {
  this.name = name;
  this.password = password;
}

public String toString() {  // 列印 Account class 的 properties
  return "name:" + this.name + " password:" + this.password;
}

public boolean equals(Object obj) {    
    // 這裡為了方便測試, 故名字相同為同一物件, db4o亦提供unique universal id
  if (!(obj instanceof Account))
   return false;
  return name.equals(((Account) obj).name);
}

public int hashCode() {    
  return 15 * name.hashCode();
}

public Account() {
}

public String getName() {
  return name;
}

public void setName(String name) {
  this.name = name;
}

public String getPassword() {
  return password;
}

public void setPassword(String password) {
  this.password = password;
}

}


Db4oObjectPool

// 這個 Object Pool 其實是為了實現 類似hibernate open session in view 的概念
// 如果只為測試, 這個 class 實在是多餘的, 這裡是為了作為日後回憶之用, 尤其是開發web project
public class Db4oObjectPool {
private static ObjectContainer db;

private static ThreadLocal tl = new ThreadLocal();   // 這裡使用了 thread specific storage

private Db4oObjectPool() {
  if (db == null) {
   db = Db4o.openFile("db.yap");          // 建立資料檔案
   Db4o.configure().encrypt(true);            // 設定資料檔案 db.yap 被加密
   Db4o.configure().password("123123");    // 設定資料檔案 db.yap 需要密碼才能訪問
  }
}

private static synchronized Object getThreadLocalInstance() {
  return tl.get();
}

// 其實db4o是 threadsafe,  下面不需要加 synchronized block, 這裡為了方便日後回憶
// 在 J2EE 開發,  使用ObjectServer#openClient().  
// 可呼叫 Db4oServlet.sharedTransaction() , 就可以在每個 sesssion 裡取得transaction
// 在這例中為了簡便, 使用了 Db4o.openFile().
// 在 J2EE 開發中, 可呼叫 Db4oServlet.sharedTransaction() ,
// 在多個 session 裡就只能取得一個transaction
public static Db4oObjectPool getInstance() {  
     // 這裡使用了singleton, 有lazy initialization作用
   if (getThreadLocalInstance() == null) {          // 這裡使用了 double-checked locking
    synchronized (Db4oObjectPool.class){  
           // 但在 jdk 1.4 double-checked locking 有問題, jdk 5解決了這問題
     if (getThreadLocalInstance() == null) {         tl.set(new Db4oObjectPool());    
          // 這裡實現每條thread共享同一個instance, 對web project 尤其重要
       }
    }
  }
  return (Db4oObjectPool) getThreadLocalInstance();
}

public ObjectContainer getDB() {
  return db;
}

}


Db4oObject
public abstract class Db4oObject {    
   // 這個class 集中處理DAO (data access model) 共通代碼

protected ObjectContainer getDB(){
  return Db4oObjectPool.getInstance().getDB();
}

protected boolean backup(){    // 設定 backup 資料檔案
  try{
   getDB().ext().backup("D:\\db_backup.yap");     // 設定產生 backup 檔案路徑
  } catch(Exception e){
   return false;
  }
  return true;
}

protected void saveOrUpdate(Object object) {
  getDB().set(object);           // 由於前面Account裡改寫了equals, 故name已成為unique id
}

protected Object load(Object object){    // 取出某特定的物件實例
  return getDB().get(object).next();
}

protected ObjectSet loadAll() {   // 將所有物件實例取出來,
  return getDB().query().execute();
}

protected void close() {   // 關閉資料庫檔案, 這裡要小心
  getDB().close();
}

protected void commit(){    // 提交
  getDB().commit();
}

protected void rollback(){   // 撤回
  getDB().rollback();
}

}



AccountDAO
public class AccountDAO extends Db4oObject {
   // 這個 DAO class, 主要的工作為 CRUD ( Create, Restore, Update, Delete)

public void deleteAll() {     // 將所有Account instances 刪除
  for (ObjectSet os = loadAll(); os.hasNext();) {
   Account account = (Account) os.next();
   getDB().delete(account);
  }
}

public static void main(String[] args) {  // 我們直接在 DAO class 裡測試
  AccountDAO dao = new AccountDAO();
  try {
   dao.deleteAll();    // 清空 Account instances
   Account account1 = new Account("joeyta", "pass123");
   dao.saveOrUpdate(account1);   // 將 account1 儲存
   dao.saveOrUpdate(new Account("jane", "pass456"));  // 儲存另一 account
   System.out.println("Before update:");
   for (ObjectSet os = dao.loadAll(); os.hasNext();) {   // 打印所有資料檔案裡的物件實例
               // 這裡測試只有Account, 當有不用的class時出現 Type Cast 的 Exception, 要留意
    Account account = (Account) os.next();
    System.out.println(account);
   }

   account1.setPassword("pass000");   // 更改 account1 密碼
   dao.saveOrUpdate(account1);   // 由於 Account 裡name為identifier, 所以這裡 account1 為更新
   System.out.println("After update:");  
   for (ObjectSet os = dao.loadAll(); os.hasNext();) {   // 再次打印所有Account物件
               // 這裡測試只有Account, 當有不用的class時出現 Type Cast 的 Exception, 要留意
    Account account = (Account) os.next();
    System.out.println(account);
   }  
  
   dao.commit();
   dao.backup();                //  這裡執行 backup 資料檔案
  } catch (Exception e){
   dao.rollback();   // 當有 Excption 發生時 rollback 所有變更
  } finally {
   dao.close();      // 這裡如果實作open session in view 概令, 需要改寫成filer
  }
}
}


運行 AccountDAO 後輸出結果為:
Before update:
name:jane password:pass456
name:joeyta password:pass123
After update:
name:jane password:pass456
name:joeyta password:pass000


使用Object Manager 瀏覽數據:
下載 objectmanager-1.7.1-win_ikvm.zip ( 這個包含 java vm)
http://developer.db4o.com/Files/

解壓後 直接 運行 objectmanager.bat
然後會出現 Object Manager 的介面,
選擇 File -> Open "Encrypted" File      // 由於上面 encrypt 設為true, 故這裡使用encrypted
browse 上面例子產生的資料庫檔案 db.yap
輸入 例子裡的 password : 123123        // 我測試時使用密碼打不開, 不輸入密碼卻能開啟檔案, 其怪
如果成功連接了就會出現下面的畫面:
image

選擇 File -> Query , 選擇要查詢的 Object class
就會出現下面的畫面:
image

選擇 File -> Export to XML
輸入 db.xml, 按存檔就會產生 db.xml 到目錄裡.
db.xml 的內容為:
<com.db4o.reflect.generic.GenericObject id="1527">
   <name><>;jane></name>
   <password><>;pass456></password>
</com.db4o.reflect.generic.GenericObject>
<com.db4o.reflect.generic.GenericObject id="2021">
   <name><>;joeyta></name>
   <password><>;pass000></password>
</com.db4o.reflect.generic.GenericObject>


當使用commit() 及rollback(), db4o 自動提供 read committed 的transactions.

db4o的功能不少,有興趣的同仁可參考下面更多官方的教學:
http://www.db4o.com/community/testdrive/formulaonetutorial.aspx
http://www.db4o.com/about/productinformation/resources/db4o-5.0-tutorial-java.pdf
posted on 2006-12-05 15:30 dyerac in java... 阅读(704) 评论(0)  编辑  收藏 所属分类: database

只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © dyerac in java... Powered by: 博客园 模板提供:沪江博客