db4o最佳实践:从数据库查询对象

9

我正在使用两种不同的方法来查询db4o中的对象,我想讨论一下这个问题。

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

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

第二个示例中,我创建了一个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个回答

11

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

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

另一个问题(如果您在嵌入式模式下运行db4o)是打开数据库是一个耗时的操作。因此,如果您不断地打开/关闭数据库,则可能会遇到性能问题(另一方面,打开客户端连接并不那么昂贵,所以不应该造成任何问题)。


哇,谢谢。我确实遇到了我的对象被存储两次的问题,而且我不知道为什么。你的答案现在让我清楚了这个问题。非常感谢Vagaus。 - jcdmb
嘿Vagaus,我刚看到你是巴西人 :) 我正在德国的卡尔斯鲁厄理工学院(KIT)完成计算机科学课程。我一直想认识一些在巴西信息技术领域工作的人,以获取一些相关信息。我们可以交流一些小想法吗?如果可能,请将您的电子邮件发送给我的电子邮件:borges@fzi.de。非常感谢您的合作。抱抱! - jcdmb
我有一个问题,我们如何检查db4o ObjectContainer是否关闭? - Alexander Mills
基本上,这不可能是最好的方法来完成它: - Alexander Mills
public ObjectContainer getDb() { if (db == null) { System.out.println("在 " + dbci + " 连接中,db 为空。必须创建新的 DB 对象。"); db = Db4oEmbedded.openFile(dbci.getConnectionName()); } try{ db.query(); } catch(Exception e){ db = Db4oEmbedded.openFile(dbci.getConnectionName()); } return db; } - Alexander Mills

4
在第一个代码示例中,您正在使用嵌入式模式打开db4o数据库,基本上您会获得一个本地对象容器,并在关闭db之前处理一个事务。
在第二个示例中,您正在实例化一个对象服务器。在使用对象服务器时有两种模式:本地模式(当选择端口号0时,这就是您所做的)和远程模式(选择主机和高于0的端口)。前者不涉及网络,而后者涉及网络(可以远程工作(即C / S))。
无论如何,使用对象服务器的优点是通过打开客户端对象容器(openClient())获得多个事务,当您打开新客户端时,您将获得一个具有自己的引用系统和独立提交/回滚(类似于新事务)的新对象容器。
因此,如果您将与在同一对象服务器上操作的多个客户端一起工作并且需要事务分离,则通常会选择第二个示例。
更多信息: http://developer.db4o.com/Documentation/Reference/db4o-8.0/java/reference/index_CSH.html#client-server.htm 最好!

非常感谢您详细的解释 ;) - jcdmb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接