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

2023-11-29

这就是我想到的使用 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(使用前将#替换为@)

可以多次打开DB4o文件进行查询、插入、更新吗? 的相关文章

  • 透明AlertDialog有黑色背景

    我有一个习惯AlertDialog风格使得AlertDialog盒子透明 它工作正常 除了当我将所需的透明布局膨胀到警报对话框窗口时 它显示为黑色背景 我的目标是拥有一个完全透明的AlertDialog看起来好像只有 4 个按钮浮动 而不是
  • 有没有办法知道表中最后一次提交的值?

    我正在使用 Postgres 9 5 如果我更新一行的某些值并提交 之后有什么方法可以获取旧值吗 我在想有没有类似闪回的东西 但这将是选择性的闪回 我不想回滚整个数据库 我只需要恢复一行 简短的回答 这是不可能的 但对于未来的读者 您可以创
  • 如何获取鼠标单击相对于摆动窗口的位置

    假设我在 Java Swing JFrame 中 我点击鼠标 我想获取鼠标点击的位置在图形用户界面内 在java中 该行 int mouseX MouseInfo getPointerInfo getLocation x 似乎给出了鼠标在整
  • 求所有小于200万素数的和需要多少时间?

    我试图解决这个问题欧拉计划问题 我用java实现了欧拉筛作为辅助类 它对于小数字来说非常有效 但是当我输入 200 万作为限制时 它不会返回答案 我使用 Netbeans IDE 有一次我等了好几个小时 还是没有打印出答案 当我停止运行代码
  • 如何进行肤色匹配

    face body 你好 我是图像处理和 openCV C C 的新手 我想知道是否可以从第一张图像 脸部 中提取肤色 然后应用到第二个图像 身体 换句话说 用户上传他的面部图像 程序从该图像中提取肤色并将其应用到身体上 Thanks Ai
  • 如何让 getIntent().getExtras() 在片段中工作,“getIntent 未定义该类型”

    您好 我正在尝试将活动更改为片段 以便我可以将其添加到滑动布局中 我想我即将完成 除非任何人都可以看到我的代码中的任何其他错误 但我找不到解决方案任何地方都有问题 它说 getIntent 对于SoftwarePageFragment类型是
  • 如何对 Mathematica 笔记本中的单元格标签进行自动编号?

    我尝试按照 Mathematica 8 笔记本中的自动编号单元格的说明进行操作 此处 http reference wolfram com mathematica tutorial AutomaticNumbering html 我创建了一
  • 如何确定用户输入是奇数还是偶数?

    我应该找出用户输入的 5 个数字是否都是奇数或偶数 它应该有一个看起来像这样的输出 gt gt gt Enter 5 integers e g 1 2 3 4 5 1 2 3 4 5 The array contains odd and e
  • std::pair 排序定义明确吗?

    看来我可以排序std vector
  • !function ($) { $(function(){ }) }(window.jQuery) 的作用是什么?

    我正在使用 twitter bootstrap 创建一个网站 并尝试初始化工具提示 除了添加以下内容之外 rel tooltip tooltip in application js unless I retain the following
  • 类变量的行为类似于实例变量 (Python 3.4)

    Python 3 4 0a1视窗8 1 创建的类 class Bank object bankrupt False 在空闲状态下输入命令 main 结果如下 gt gt gt a Bank gt gt gt b Bank gt gt gt
  • 全局let变量存储在哪里? [复制]

    这个问题在这里已经有答案了 我在全局范围内创建了一个导航器变量 并使用它为其分配了一个字符串let关键词 in a browser let navigator Hello console log navigator Hello consol

随机推荐