【问题标题】:Loading metadata with breeze is slow用微风加载元数据很慢
【发布时间】:2013-08-27 08:58:01
【问题描述】:

我正在使用微风从 MVC 4 应用程序中的远程 SQL Server 数据库加载一些数据。该数据库有大约 40 个实体。使用微风加载元数据需要很多时间:大约在 14 秒到 35 秒之间,尽管大小不是很大:~ 600 kb。

加载元数据后,获取实体的速度要快得多。例如,一个 2.5 Mb 的实体在 2.5 秒内加载完毕。

https://www.dropbox.com/s/n8eqv5ezqr1qqlp/loading.png

我的问题是:

加载速度这么慢有什么原因吗?有什么方法可以减少加载时间?

【问题讨论】:

  • 从屏幕截图可以看出问题出在服务器上。如果这需要这么长时间,那么您可以在服务器上实现一些缓存机制。检查第二个客户端获取元数据需要多长时间。
  • 我尝试使用第二个客户端获取数据,但时间相同。我在想也许有一种方法可以将元数据存储在应用程序的文件中,这样我就可以避免调用服务器。
  • 您可以将其作为字符串存储在静态字段中。
  • 感谢您的回复!显然,它不是加载元数据,而是连接到缓慢的 SQL 服务器。对此有什么建议吗? dropbox.com/s/ajypwpgoyn8z24q/Capture.PNG
  • 经过更多研究后,我发现实体框架是造成延迟的原因。不好的部分是似乎没有解决方案......

标签: javascript asp.net .net entity-framework breeze


【解决方案1】:

一旦开始,我很少向服务器询问元数据。我快速从 EntityManager 的元数据存储中导出元数据,并将其作为全局变量转储到 JavaScript 文件中。我将它与我的 index.html 中的其他脚本一起包含在内。我在启动时将此 var 加载到经理的 metadateStore 中。

随着时间的推移,我变得越来越复杂,在服务器启动时自动重新生成它,将它序列化并存储在浏览器本地存储中等等。一旦你意识到元数据只是一个 JS 对象,你就掌握了无尽的关键。聪明。

【讨论】:

  • 感谢@Ward 的回答。我也得出了这个结论。由于数据库结构不会改变,我将元数据作为字符串保存到应用程序中。正如我之前所说,在我深入研究了这个问题之后,我发现获取元数据并不是慢的,而是实体框架的初始化。我现在正在使用 Entity Framework 5 并阅读 this 我正在考虑将 EF 更新到版本 6 rc1。微风支持这个版本吗?
  • Breeze.net,其中包括 EFContextProvider,尚未针对尚未发布的 EF6 进行转换或测试。它可能会绊倒一些已经改变的东西。一般来说,我们不会在 MS 产品即将发布之前打扰。太多的流失让我们无法处理和支持。
  • @Ward:你有如何手动设置元数据使其不会尝试从服务器加载元数据的代码示例吗?我正在尝试使用const metadataStore: MetadataStore = MetadataStore.importMetadata(metadata); const entityManagerConfig: EntityManagerOptions = { serviceName: "http://localhost:63553", metadataStore: metadataStore }; this.entityManager = new EntityManager(entityManagerConfig);,但它仍然在执行查询时对元数据进行 HTTP 调用。请指教。
【解决方案2】:

您可以通过将元数据嵌入到您的脚本中并按照@Ward 的建议手动向 Breeze 提供元数据,从而消除从服务器单独的网络调用中加载元数据的需要。

这里是如何(我在下面使用 TypeScript):

import { DataService, EntityManager, MetadataStore, NamingConvention } from "breeze-client";

        // Your metadata object
        const metadata: any = Metadata.value;

        // define the Breeze `DataService` for this app
        const dataService: DataService = new DataService({
            serviceName: "http://localhost:63000",
            hasServerMetadata: false  // don't ask the server for metadata
        });

        // create the metadataStore 
        const metadataStore: MetadataStore = new MetadataStore({
            namingConvention: NamingConvention.camelCase // if you use this convention
        });

        // initialize it from the application's metadata variable
        metadataStore.importMetadata(metadata);

        const entityManagerConfig: EntityManagerOptions = {
            dataService: dataService,
            metadataStore: metadataStore
        };

        this.entityManager = new EntityManager(entityManagerConfig);

现在您有一个使用元数据初始化并准备好执行查询的 EntityManager 实例。

欲了解更多信息,请参阅official docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-29
    • 2015-11-25
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多