可以打开一个DB4o文件进行多次查询、插入和更新吗?

可以打开一个DB4o文件进行多次查询、插入和更新吗?,db4o,Db4o,这就是我使用DB4o的想法。当我需要查询时,我会打开文件,读取并关闭: using (IObjectContainer db = Db4oFactory.OpenFile(Db4oFactory.NewConfiguration(), YapFileName)) { try { List<Pilot> pilots = db.Query<Pilot>().ToList<Pilot>(); } finally

这就是我使用DB4o的想法。当我需要查询时,我会打开文件,读取并关闭:

using (IObjectContainer db = Db4oFactory.OpenFile(Db4oFactory.NewConfiguration(), YapFileName))
{
    try
    {
        List<Pilot> pilots = db.Query<Pilot>().ToList<Pilot>();
    }
    finally
    {
       try { db.Close(); }
       catch (Exception) { };
    }
}
通过这种方式,我想我只需要在需要的时候打开文件,并在大部分时间关闭文件,就能使文件更整洁。但我一直在失去理智

Unable to cast object of type 'Db4objects.Db4o.Reflect.Generic.GenericObject' to type 'Pilot'

使用DB4o的正确方法是什么?

可以多次重新打开数据库。问题在于性能和失去“身份”。此外,您不能保留对查询结果的引用,并在关闭数据库后尝试对其进行迭代(根据您的代码,看起来您希望这样做)

当找不到类时,将实例化GenericObject

你能提供一个完整的,最低限度的,不适合你的样品吗

另外,您使用的是哪个db4o版本


最好的

不,这样工作不是个好主意。db4o对象容器在应用程序运行时始终保持打开状态。有几个原因:

  • db4o维护一个用于标识持久对象的引用系统,因此当您对已存储的对象(而不是存储新对象)调用#store()时,它可以进行更新。关闭ObjectContainer时,此引用系统将关闭,因此更新将无法工作
  • 每次重新打开数据库文件时,都必须从中读取类元数据。使用db4o时,还必须再次分析所有持久类的结构。虽然这两种操作都非常快,但您可能不希望每次存储单个对象时都会有这种开销
  • db4o为类和字段索引以及数据库文件本身提供了非常高效的缓存。如果关闭并重新打开该文件,则不会利用它们
  • 当您使用多个线程时,设置代码的方式可能会失败。如果两个线程希望同时打开数据库文件,该怎么办?db4o数据库文件只能打开一次。可以对同一开放实例运行多个事务和多个线程,如果需要多个事务,还可以使用客户机/服务器模式
  • 稍后,您可能想尝试透明激活和透明持久化。透明激活在第一次访问对象成员时延迟加载它们。透明持久性自动存储事务中修改的所有对象。要使透明激活(TA)和透明持久性(TP)工作,您当然必须保持ObjectContainer的打开状态
您不必担心经常有一个打开的数据库文件。db4o的一个关键目标是在(移动)设备中嵌入使用。这就是为什么我们编写db4o时,可以随时关闭计算机,而不会有数据库损坏的风险,即使文件仍然打开

返回GenericObject而不是Pilot对象的可能原因:

  • 当包含先导对象的程序集的程序集名称在两次运行之间发生更改时,可能会发生这种情况,原因可能是您让VisualStudio自动生成该名称,也可能是您手动更改了该名称
  • 也许“db4o”是程序集名称的一部分?最近的一个构建在过滤内部类方面过于激进。这个问题很久以前就解决了。您可以下载并尝试最新版本,“开发”或“生产”都可以
  • 在我曾经做过的一次演示中,当db4o对象容器在一个“使用”块中打开时,我曾经看到过非常奇怪的症状。您可能希望在不使用该选项的情况下工作,并始终保持db4o ObjectContainer处于打开状态

性能:我认为更可取的做法是关闭文件,而不是担心性能,并始终保持打开状态,而不会关闭文件。失去“身份”:请您详细说明关闭后的身份引用是什么db:不,我没有这么做,我使用的是DB4o附带的试点示例程序,我使用的是7.12版。感谢关注性能:如果您一直打开/关闭数据库,它将需要在每次查询对象时加载它们。失去标识意味着db4o将“忘记”对象已经存储在数据库中。例如,如果从db close/reopen中检索一个对象,则db和传递该对象的调用Store()db4o将存储该对象的第二个副本。您好,快速提问。这是我使用db4o的第一个项目,我一直在经历信息丢失。我使用单例模式,我的ObjectContainer只打开一次。每次.Store()之后,我都不会关闭ObjectContainer。我对信息丢失的第一个猜测是发生了问题,并发生了回滚。我的问题是:如果在每个.Store()之后关闭连接不是一个好主意,那么我是否应该在每个.Store()之后至少执行一个.Commit()?这是一个老问题,但我无法得到我的问题的答案:即使关闭并重新打开db4o,我如何保持“标识”,执行对象更新?我要发疯去寻找解决方案;我持久化到Db4o的实体覆盖了Equals和GetHashCode以满足我的更新需要,但我无法使其工作:(我使用的是Db4o 8.0版本,嵌入式方式。和往常一样,在我发布一个请求后2分钟,我找到了解决方案:没有解决方案:-)请看:+1作为Db4o背后的传奇开发人员(任何能够编写如此复杂的数据库的人都必须与Linus本人一起完成!)。Carl,快速提问。这是我使用db4o的第一个项目,我一直在经历信息丢失。我使用单例模式,我的ObjectContainer只打开一次。每次.Store()之后,我都不会关闭ObjectContainer。我对信息丢失的第一个猜测是发生了问题,并发生了回滚。我的问题是:如果在每个.Store()之后关闭连接不是一个好主意,我至少应该执行
Unable to cast object of type 'Db4objects.Db4o.Reflect.Generic.GenericObject' to type 'Pilot'