Object DataBase--db4o之旅(2)

来源:互联网 发布:淘宝店铺信誉怎么看 编辑:程序博客网 时间:2024/04/28 02:41

4.Structed Object

如果一个对象中不仅仅有常见的java类型还包含其他的对象,那么在modify 被包含的对象的时候,就会出现一个问题。如果我更新了这些被包含的对象,那么在update delete 的时候,他们会不会被操作到?db4o中 提供了一个 depth的概念。所有object 的默认的update depth为1,这就意味着该object 中的primitive 和 string members 能被update,其他类型的对象将不被upda
te。 同样对应delete 如果想实现 对象中的递归删除, 那同样需要利用db4o中的 delete depth


这是update depth:
[updatePilotSeparateSessionsImprovedPart1]
Db4o.configure().objectClass("com.db4o.f1.chapter2.Car")
.cascadeOnUpdate(true);

这是delete depth:
[deleteDeepPart1]
Db4o.configure().objectClass("com.db4o.f1.chapter2.Car")
.cascadeOnDelete(true);

Again: Note that all configuration must take place before the ObjectContainer is opened.

其实这里还没有结束,对于delete 会出现这么一个问题,当我通过 delet depth 将一个instance 删除了,他里面包含的某个其他类型的object instance 也被删除了,但是这个
对象还在被其他对象引用,那这个问题怎么办? 现在db4o 还没有解决方法。我们现在只能
小心操作delete。

 

5. Transactions
对应数据库来说,transaction 是必须的,下面我们来看看object dataBase--db4o是怎么
来处理transcation的。

当open  a container的时候,一个transaction 就隐型地开始了,而当close 这个container,
那么当前的transaction就隐型地提交了。

那么如果显型地commit 和 rollback呢? 下面有这么两个例子:

public static void storeCarCommit(ObjectContainer db) {
Pilot pilot=new Pilot("Rubens Barrichello",99);
Car car=new Car("BMW");
car.setPilot(pilot);
db.set(car);
db.commit();
}


public static void storeCarRollback(ObjectContainer db) {
Pilot pilot=new Pilot("Michael Schumacher",100);
Car car=new Car("Ferrari");
car.setPilot(pilot);
db.set(car);
db.rollback();
}

与JDBC相比,好像有一个区别就是,db4o不需要来设置commit的模式, setAutoCommit()

她就是如果db.close(),那么就autoCommit了。

对于Object Database,因为他们都是用object 来存取,那么当object 被set 相应的值后,但没有save到database,也就说
current transaction 被rollback,那么为了保持数据的一致性,需要refresh live object.那么这个怎么来实现呢?

public static void carSnapshotRollbackRefresh(ObjectContainer db)
{
ObjectSet result=db.get(new Car("BMW"));
Car car=(Car)result.next();
car.snapshot();
db.set(car);
db.rollback();
PDF by iText, generated by Doctor, courtesy of db4objects Inc.
db.ext().refresh(car,Integer.MAX_VALUE);
System.out.println(car);
}

6.Embedded server
对应 Embedded server,open一个port为0的server。

[accessLocalServer]
ObjectServer server=Db4o.openServer(Util.YAPFILENAME,0);
try {
PDF by iText, generated by Doctor, courtesy of db4objects Inc.
ObjectContainer client=server.openClient();
// Do something with this client, or open more clients
client.close();
}
finally {
server.close();
}

7.Networking

[accessRemoteServer]
ObjectServer server=Db4o.openServer(Util.YAPFILENAME,PORT);
server.grantAccess(USER,PASSWORD);
try {
ObjectContainer
client=Db4o.openClient("localhost",PORT,USER,PASSWORD);
// Do something with this client, or open more clients
client.close();
}
finally {
server.close();
}