这就是我想到的使用 DB4o 的方式。当我需要查询时,我会打开文件,读取并关闭:
using (IObjectContainer db = Db4oFactory.OpenFile(Db4oFactory.NewConfiguration(), YapFileName))
{
try
{
List<Pilot> pilots = db.Query<Pilot>().ToList<Pilot>();
}
finally
{
try { db.Close(); }
catch (Exception) { };
}
}
稍后,当我需要插入时,然后
using (IObjectContainer db = Db4oFactory.OpenFile(Db4oFactory.NewConfiguration(), YapFileName))
{
try
{
Pilot pilot1 = new Pilot("Michael Schumacher", 100);
db.Store(pilot1);
}
finally
{
try { db.Close(); }
catch (Exception) { };
}
}
通过这种方式,我想我可以只在需要时打开它,并在大部分时间关闭它,从而使文件更加整洁。但我不断收到 InvalidCastException
Unable to cast object of type 'Db4objects.Db4o.Reflect.Generic.GenericObject' to type 'Pilot'
DB4o的正确使用方法是什么?
不,这样工作不是一个好主意。 db4o ObjectContainer 旨在在应用程序运行时始终保持打开状态。有几个原因:
- db4o 维护一个参考系统来识别持久对象,因此当您对已存储的对象(而不是存储新对象)调用 #store() 时,它可以进行更新。当您关闭 ObjectContainer 时,该参考系统也会关闭,因此更新将不起作用。
- 每次重新打开数据库文件时,都必须从数据库文件中读取类元数据。当使用所有持久类时,db4o 还必须再次分析它们的结构。虽然这两个操作都非常快,但您可能不希望每次存储单个对象时都有这种开销。
- db4o 对类和字段索引以及数据库文件本身具有非常高效的缓存。如果您关闭并重新打开该文件,您将无法利用它们。
- 当您使用多个线程时,您设置代码的方式可能会失败。如果两个线程想要同时打开数据库文件怎么办? db4o 数据库文件只能打开一次。可以针对同一个打开的实例运行多个事务和多个线程,如果需要多个事务,也可以使用客户端/服务器模式。
- 稍后您可能想尝试透明激活和透明持久。透明激活会在首次访问对象成员时延迟加载对象成员。透明持久性自动存储事务中修改的所有对象。为了使透明激活 (TA) 和透明持久性 (TP) 正常工作,您当然必须保持 ObjectContainer 处于打开状态。
您无需担心不断打开数据库文件。 db4o 的主要目标之一是在(移动)设备中的嵌入式使用。这就是为什么我们以这样的方式编写 db4o,即使文件仍然打开,您也可以随时关闭计算机,而不会冒数据库损坏的风险。
您获得 GenericObject 而不是 Pilot 对象的可能原因:
- 当包含 Pilot 对象的程序集的程序集名称在两次运行之间发生更改(因为您让 VisualStudio 自动生成名称或因为您手动更改了名称)时,可能会发生这种情况。
- 也许“db4o”是您的程序集名称的一部分?最近的构建之一在过滤内部类方面过于激进。这个问题很久以前就已经被修复了。您可能想下载并尝试最新版本,“开发”或“生产”都可以。
- 在我曾经做过的一次演示中,当 db4o ObjectContainer 在“using”块中打开时,我曾经看到过非常奇怪的症状。无论如何,您可能希望在没有它的情况下工作并保持 db4o ObjectContainer 始终打开。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)