【发布时间】:2011-12-09 23:35:41
【问题描述】:
我正在运行一个有多个客户端访问它的 db4o 服务器。我刚刚遇到了一个客户没有看到另一个客户的变化的问题。从我在网络上的研究来看,基本上有两种方法可以解决它。
1:在对象上调用 Refresh()(来自http://www.gamlor.info/wordpress/2009/11/db4o-client-server-and-concurrency/):
const int activationDeph = 4;
client2.Ext().Refresh(objFromClient2, activationDeph);
2:不缓存 IObjectContainer,而是为每个 DB 请求打开一个新的 IObjectContainer。
对吗?
是的,#1 更有效,但是指定刷新哪些对象真的很现实吗?我的意思是,当涉及数据库时,每次客户端访问它时,它都应该获得最新信息。这就是为什么我倾向于#2。另外,我没有主要的效率问题。
那么,我说这两种方法对吗?或者还有别的吗?
还有,等一下……当你的对象超出范围时会发生什么?在计时器上,我调用了一个从数据库服务器获取对象的方法。该方法实例化对象。由于对象超出范围,因此无法刷新。当我打电话给数据库时,我看不到客户端的变化。在这种情况下,似乎唯一的选择是打开一个新的 IObjectContainer。没有?
** 编辑 **
我想我会使用我最终决定使用的解决方案发布一些代码。由于每次调用都使用新的 IObjectContainer 存在一些严重的复杂性,因此我将在每个访问数据库的方法中执行 Refresh()(请参阅下面的 Refresh() 行)。由于我已将数据库访问封装到逻辑类中,因此我可以确保每次都在那里执行 Refresh()。我刚刚对此进行了测试,它似乎可以正常工作。
注意:下面的数据库变量是 db4o IObjectContainer。
public static ApplicationServer GetByName(string serverName)
{
ApplicationServer appServer = (from ApplicationServer server in Database
where server.Name.ToUpperInvariant() == serverName.ToUpperInvariant()
select server).FirstOrDefault();
Database.Ext().Refresh(appServer, 10);
return appServer;
}
【问题讨论】:
标签: db4o