dyerac  
          dyerac In Java
          公告

          日歷
          <2006年12月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456
          統計
          • 隨筆 - 36
          • 文章 - 10
          • 評論 - 94
          • 引用 - 0

          導航

          常用鏈接

          留言簿(5)

          隨筆分類(49)

          隨筆檔案(36)

          文章分類(11)

          文章檔案(10)

          相冊

          dyerac

          搜索

          •  

          積分與排名

          • 積分 - 79316
          • 排名 - 705

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

           
          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... 閱讀(713) 評論(0)  編輯  收藏 所屬分類: database
           
          Copyright © dyerac in java... Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 嘉定区| 抚顺市| 神农架林区| 资讯 | 疏附县| 疏勒县| 金华市| 南靖县| 公安县| 萍乡市| 东明县| 封开县| 邵阳市| 荣成市| 同德县| 石首市| 长治县| 平南县| 巴林右旗| 东安县| 盘山县| 兰考县| 凤翔县| 抚宁县| 姜堰市| 汝城县| 八宿县| 神木县| 五原县| 浦城县| 湘潭市| 信阳市| 渝北区| 浦县| 屯昌县| 麻城市| 伊川县| 莱州市| 青浦区| 永年县| 兴义市|