<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    dyerac  
    dyerac In Java
    公告

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

    導(dǎo)航

    常用鏈接

    留言簿(5)

    隨筆分類(49)

    隨筆檔案(36)

    文章分類(11)

    文章檔案(10)

    相冊

    dyerac

    搜索

    •  

    積分與排名

    • 積分 - 79254
    • 排名 - 705

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

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

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

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

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

    解壓後 把下面的 library 加入環(huán)境變數(shù) CLASSPATH 裡:
    bloat-1.0.jar????????????????????//??這個library 優(yōu)化執(zhí)行階段
    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 優(yōu)化編譯或執(zhí)行階段


    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 其實是為了實現(xiàn) 類似hibernate open session in view 的概念
    // 如果只為測試, 這個 class 實在是多餘的, 這裡是為了作為日後回憶之用, 尤其是開發(fā)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);????????????// 設(shè)定資料檔案 db.yap 被加密
    ?? Db4o.configure().password("123123");????// 設(shè)定資料檔案 db.yap 需要密碼才能訪問
    ??}
    }

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

    // 其實db4o是 threadsafe,??下面不需要加 synchronized block, 這裡為了方便日後回憶
    // 在 J2EE 開發(fā),??使用ObjectServer#openClient().??
    // 可呼叫 Db4oServlet.sharedTransaction() , 就可以在每個 sesssion 裡取得transaction
    // 在這例中為了簡便, 使用了 Db4o.openFile().
    // 在 J2EE 開發(fā)中, 可呼叫 Db4oServlet.sharedTransaction() ,
    // 在多個 session 裡就只能取得一個transaction
    public static Db4oObjectPool getInstance() {??
    ???? // 這裡使用了singleton, 有l(wèi)azy 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());????
    ??????????// 這裡實現(xiàn)每條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(){????// 設(shè)定 backup 資料檔案
    ??try{
    ?? getDB().ext().backup("D:\\db_backup.yap");???? // 設(shè)定產(chǎn)生 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() {?? // 關(guān)閉資料庫檔案, 這裡要小心
    ??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, 當(dāng)有不用的class時出現(xiàn) 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, 當(dāng)有不用的class時出現(xiàn) Type Cast 的 Exception, 要留意
    ????Account account = (Account) os.next();
    ????System.out.println(account);
    ?? }??
    ??
    ?? dao.commit();
    ?? dao.backup();????????????????//??這裡執(zhí)行 backup 資料檔案
    ??} catch (Exception e){
    ?? dao.rollback();?? // 當(dāng)有 Excption 發(fā)生時 rollback 所有變更
    ??} finally {
    ?? dao.close();??????// 這裡如果實作open session in view 概令, 需要改寫成filer
    ??}
    }
    }


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


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

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

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

    選擇 File -> Export to XML
    輸入 db.xml, 按存檔就會產(chǎn)生 db.xml 到目錄裡.
    db.xml 的內(nèi)容為:
    <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>


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

    db4o的功能不少,有興趣的同仁可參考下面更多官方的教學(xué):
    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... 閱讀(712) 評論(0)  編輯  收藏 所屬分類: database

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
     
    Copyright © dyerac in java... Powered by: 博客園 模板提供:滬江博客
    主站蜘蛛池模板: 亚洲视频在线免费看| 日韩a在线观看免费观看| 亚洲偷偷自拍高清| www.亚洲精品.com| 无码中文字幕av免费放dvd| 亚洲永久在线观看| 中文字幕亚洲日本岛国片| 真实国产乱子伦精品免费| 蜜芽亚洲av无码一区二区三区| 最新亚洲成av人免费看| 一色屋成人免费精品网站 | 国产99精品一区二区三区免费 | 日韩免费一级毛片| 久艹视频在线免费观看| 亚洲高清毛片一区二区| 亚洲国产精品线在线观看| 国产无遮挡吃胸膜奶免费看 | 成人电影在线免费观看| 亚洲欧洲av综合色无码| 亚洲第一中文字幕| 亚洲熟女乱综合一区二区| 无码人妻一区二区三区免费手机| 中文字幕av免费专区| 亚洲s码欧洲m码吹潮| 亚洲综合免费视频| 亚洲色WWW成人永久网址| 日韩免费一区二区三区| 国产精品免费网站| 野花香高清在线观看视频播放免费 | 久久精品国产69国产精品亚洲| 日韩精品免费一区二区三区| 91热久久免费精品99| 国产va免费精品| 苍井空亚洲精品AA片在线播放 | 亚洲欧洲无码AV不卡在线| 亚洲资源在线视频| 国产亚洲av片在线观看16女人| 亚洲国产精品激情在线观看| 日韩免费视频在线观看| 无码人妻久久一区二区三区免费丨 | 中文在线观看永久免费|