Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java db4o体验?_Java_Db4o - Fatal编程技术网

Java db4o体验?

Java db4o体验?,java,db4o,Java,Db4o,我目前正在试用db4o(java版本),我非常喜欢我所看到的。但我不禁想知道它在真实的(网络)环境中是如何运行的。有没有人可以分享关于运行db4o的经验(好的或坏的) 我们在一个大型客户机/服务器项目中运行DB40.NET版本 我们的经验是,您可以获得比典型关系数据库更好的性能 但是,您确实需要调整对象以获得这种性能。例如,如果您有一个包含很多对象的列表,那么这些列表的DB4O激活会很慢。有许多方法可以绕过这个问题,例如,通过颠倒关系 另一个痛苦是激活。从DB4O检索或删除对象时,默认情况下,它

我目前正在试用db4o(java版本),我非常喜欢我所看到的。但我不禁想知道它在真实的(网络)环境中是如何运行的。有没有人可以分享关于运行db4o的经验(好的或坏的)

我们在一个大型客户机/服务器项目中运行DB40.NET版本

我们的经验是,您可以获得比典型关系数据库更好的性能

但是,您确实需要调整对象以获得这种性能。例如,如果您有一个包含很多对象的列表,那么这些列表的DB4O激活会很慢。有许多方法可以绕过这个问题,例如,通过颠倒关系

另一个痛苦是激活。从DB4O检索或删除对象时,默认情况下,它将激活整个对象树。例如,加载一个Foo将加载Foo.Bar.Baz.Bat等,直到没有东西可以加载为止。虽然从编程的角度来看这很好,但性能会降低对象中更多嵌套的速度。为了提高性能,您可以告诉DB4O需要激活多少层。如果您有很多对象,那么这样做很耗时

另一个痛苦的领域是文本搜索。DB4O的文本搜索远远慢于SQL全文索引。好消息是,在DB4O之上设置文本搜索引擎很容易。在我们的项目中,我们已经连接了Lucene.NET来索引我们想要的文本字段

有些API似乎不起作用,例如在应用数据库升级时有用的GetField API。(例如,您重命名了一个属性,并且想要升级数据库中的现有对象,您需要使用这些“反射”API来查找数据库中的对象。其他API,例如[Index]属性在稳定的6.4版本中不起作用,您必须改为使用Configure().Index(“someField”)指定索引,它不是强类型的

我们已经看到,数据库越大,性能就会下降。我们现在有一个1GB的数据库,速度仍然很快,但还没有开始使用小型数据库时快

我们发现了另一个问题,如果数据库中不再存在该ID,Db4O.GetByID将关闭数据库

我们发现本机查询语法(最自然、语言集成的查询语法)比不太友好的SODA查询慢得多。因此,不要键入:

// C# syntax for "Find all MyFoos with Bar == 23".
// (Note the Java syntax is more verbose using the Predicate class.)
IList<MyFoo> results = db4o.Query<MyFoo>(input => input.Bar == 23);
//C#用于“查找所有带Bar==23的myfoo”的语法。
//(注意,使用谓词类时,Java语法更为详细。)
IList results=db4o.Query(input=>input.Bar==23);
你需要的不是漂亮的查询代码,而是一个丑陋的SODA查询,它是基于字符串的,不是强类型的

对于.NET用户来说,他们最近引入了一个LINQ-to-DB4O提供程序,它提供了迄今为止最好的语法。然而,性能是否能与丑陋的SODA查询相媲美还有待观察

DB4O的支持相当不错:我们已经和他们通了很多次电话,并收到了有用的信息。他们的用户论坛几乎毫无价值,但是,几乎所有的问题都没有答案。他们的JIRA bug跟踪器受到了很多关注,所以如果你有一个唠叨的bug,将它归档到JIRA上通常会得到修复。(我们已经修复了两个bug,另一个bug以半途而废的方式进行了修补。)

如果所有这些都没有吓跑你的话,让我说我们对DB4O非常满意,尽管我们遇到了一些问题。我们所获得的性能让我们尝试过的一些O/RM框架望而却步。我推荐它


2015年7月更新请记住,这个答案是在2008年写的。虽然我很欣赏这些投票,但从那时起世界已经发生了变化,而且这些信息可能不像编写时那样可靠。

我遇到的主要问题是报告。似乎没有任何办法运行高效的报告s针对db4o数据源。

大多数本机查询可以并且可以在后台高效地转换为SODA查询,因此不会产生任何影响。当然,使用NQ是首选,因为您仍然处于强类型语言的领域。如果您在让NQ使用索引方面遇到问题,请随时将您的问题发布到我会尽力帮你的


Goran

犹大,听起来您没有使用透明激活,这是最新生产版本(7.4)的一项功能?如果您指定了您正在使用的版本,可能会有其他问题在最新版本中得到解决?

您是如何使服务器实现在处理查询时不被阻止的?我们已经实现了(我希望!)这是一个非常简单的客户机/服务器性能测试,我们发现长时间运行的查询会阻止服务器处理其他查询。我们的性能客户机操作都是只读的。您可以尝试以下几种方法:多个数据库,可能每个用户一个数据库。您可以使用DB4O客户机/服务器模式,而不是嵌入式模式,后者处理线程的方式略有不同您好!关于您提到的问题,激活深度默认配置为5,因此db4o将停止激活深度为5的对象。您还可以尝试透明激活(现在db4o支持本机集合),并仅在必要时(使用对象时)让db4o激活您的对象。关于Linq、本机查询和SODA,在大多数情况下,您应该没有明显的性能差异(这种差异最常见的情况是db4o没有找到所需的程序集,例如Mono.Cecil.dll、Db4objects.db4o.Instrumentation和Cecil.FlowAnalysis)。我想纠正@Vagaus的评论,如果你不坚持转换中的限制,Linq和本机查询会有很大的区别。问题是当它无法转换本机或Linq查询时,它会恢复为激活所有查询。当我们