对于我在XPage应用程序中使用的一些SSJS代码,我有一些@DbLookup公式。到目前为止,我一直在使用@DbName()作为@DbLookup公式的第一个参数。如果我将@DbName()切换为“”(应用程序中只有一个数据库),@ DbLookup论坛会更快地执行吗? 一般来说,是否有更快的@DbLookup替代方案?
答案 0 :(得分:3)
对于第一个问题:我对此表示怀疑。虽然我自己从未养成使用@DbName()作为第一个参数的习惯,但如果它产生了很大的不同,我会感到惊讶(尽管老实说我还没有经过测试)。
对于第二个问题:是的,带有一个巨大的星号。直接使用后端类应该比@DbLookup更快,但它们也非常笨重。但是,特别是,如果您在性能敏感的情况下进行查找(例如,如果您在视图中进行多次查找),那么切换到ViewNavigators可以提供很大的提升。作为一般规则,如果你可以使用ViewNavigators做你想做的事情,那么它们是最快的方式 - 他们只需要花很多时间来了解它们什么时候可以应用以及什么时候可以应用。接下来最好的是someView.getEntryByKey和someView.getAllEntriesByKey。
我见过很多人写过" DbLookup"实现作为Java辅助函数,可能主要是为了在直接编写Java时保持旧习惯,但如果你做得好并且在参数中提供足够的额外信息以了解何时使用ViewNavigator是安全的,那么这也可以获得性能优势。
答案 1 :(得分:3)
这实际上是一个很好的问题。
我不会认为从@DbName()切换到""时,您会看到查找时间的差异。 - 这真让我感到惊讶。
现在你也要求更快的替代方案。首先,如果您有很多SSJS,由于SSJS语句的缓存有限,使用Java可能会更快(请参阅此处:http://nathantfreeman.wordpress.com/2013/04/12/xpages-performance-pro-tips/)。
当Damien Katz(http://damienkatz.net/2005/01/formula-engine-rewrite.html)重写了@ -engine时,@ -formulas变得非常快。所以你可能会发现一个古老的学校“@Dblookup(....)" (e.i.公式 - 不是SSJS)可能更快 - 取决于SSJS @DbLookup()的方式"绑定"到底层API。它应该很容易测试 - 只需编写一个Java类,它将从getSession()中返回结果.coolly(" @DBlookup(....)") - 你可以将它绑定到你的XPage通过EL(表达语言)。与往常一样,如果您想要速度,则必须确保要检索的数据位于视图中。然后代码将只读取视图索引。如果你引用一个不在视图索引中的项目,则必须打开基础笔记 - 如果它上面有附件,那么它可能真的很慢!几年前学到了很多教训。
我尝试使用getAllEntries和使用ViewNavigators从视图中读取数据。在我尝试的例子中,我不能说使用viewnavigators更快 - 虽然理论上我认为它们应该是。您可能希望将此方法与上述评估方法进行比较。
现在,还有其他选择 - 取决于您的应用程序的逻辑。我使用MVC模式(可以在这里找到一半完成的demo-app:https://bitbucket.org/john_dalsgaard/demo-apps)。在这种模式中,我将所有数据缓存在内存中的Java对象中。所以我曾经只阅读过一次 - 然后只是在内存中获取版本。我还在创建或更新数据时更新内存表示。内存中的查找(使用地图)快速起泡!但同样,它确实取决于您应用中的逻辑。
如果您得到一些有趣的发现,请告诉我们; - )
/约翰
答案 2 :(得分:3)
Paul Della Nebbia实际上对@DbLookup和ViewEntryCollection类进行了一些测试。 @DbLookup相当慢一些。正如其他人所说,它不是@Formula,因为你从Notes dev中知道它。它是一个传递给VariableResolver和PropertyResolver并映射到一组Java类和函数的关键字,每个属性都映射到Java类,因此" [FailSilent]"映射到代码"如果你找不到任何返回null"。
在@DbName()vs""上,不使用""这是一个很好的理由。如果您想在XPiNC中使用应用程序或代码,它将失败。最好养成使用@DbName()的习惯,或者更好的是