db4o从db查询对象的最佳实践

时间:2011-05-13 19:36:02

标签: c# db4o

我使用两种不同的方式来查询db4o中的对象,我想讨论它。

1)在第一个例子中,我创建了一个ObjectContainer实例,打开连接,然后关闭它。

ObjectContainer db = Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "User");
ObjectSet result = db.queryByExample(user);
db.close();

2)在第二个例子中,我创建了一个ObjectServer,让连接在应用程序的整个生命周期中打开。我还从ObjectServer打开ObjectContainer,进行查询然后关闭它:

ObjectServer userDb = Db4oClientServer.openServer(Db4oClientServer.newServerConfiguration(), "User", 0);
ObjectContainer client = client = userDb.openClient();
ObjectSet result = client.queryByExample(user);
client.close();

-

两种方法有什么主要区别?如果我从不关闭ObjectServer,这是危险的吗?

在我看来,第二种方法更好,因为如果两个不同的实例调用第一个示例中显示的方法,则第二个调用者将获得异常,导致数据库被锁定,但在第二个示例中我不会有这样的问题。由于我对db4o没有太多经验,我更愿意问我是否正确。

2 个答案:

答案 0 :(得分:11)

当您在整个应用程序生命周期中保持连接打开时,db4o效果最佳。

如果你检索一个对象,关闭数据库,重新打开它并再次存储该对象db4o将不会意识到该对象已经存储(因为你关闭了连接以及db4o的引用系统)并且将存储第二个实例。

另一个问题(如果在嵌入模式下运行db4o)是打开数据库是一项耗时的操作,因此,如果继续打开/关闭数据库,肯定会出现性能问题(另一方面,打开客户端连接)不是那么昂贵,所以应该没有任何问题)。

答案 1 :(得分:4)

在第一个代码示例中,您使用嵌入模式打开db4o数据库,基本上您将获得一个本地对象容器,并且您将处理一个事务,直到关闭数据库。

在第二个示例中,您将实例化一个对象服务器。使用对象服务器时有两种模式:本地模式(当您选择端口号0时,这就是您所做的)和远程模式(选择主机和高于0的端口)。前者不涉及网络而后者(并且可以远程工作(又称C / S))。

无论如何,使用对象服务器的优点是通过打开客户端对象容器(openClient())获得多个事务,当您打开一个新客户端时,您将获得一个具有自己的引用系统和独立提交的新对象容器/ rollback(就像新事务一样)。

因此,如果您将使用在同一对象服务器上运行的多个客户端并且需要事务分离,那么通常会使用第二个示例。

更多信息: http://developer.db4o.com/Documentation/Reference/db4o-8.0/java/reference/index_CSH.html#client-server.htm

最佳!