我使用breeze從MVC 4應用程序中的遠程SQL Server數據庫加載一些數據。該數據庫有大約40個實體。用微風加載元數據需要很多時間:大約14s到35s之間,儘管尺寸並不大:〜600kb。用微風加載元數據很慢
加載元數據後,實體獲取速度要快得多。例如2.5 Mb的實體在2.5s內加載。
https://www.dropbox.com/s/n8eqv5ezqr1qqlp/loading.png
我的問題是:
是否有一個原因,爲什麼這個加載慢,什麼將減少加載時間的方法嗎?
我使用breeze從MVC 4應用程序中的遠程SQL Server數據庫加載一些數據。該數據庫有大約40個實體。用微風加載元數據需要很多時間:大約14s到35s之間,儘管尺寸並不大:〜600kb。用微風加載元數據很慢
加載元數據後,實體獲取速度要快得多。例如2.5 Mb的實體在2.5s內加載。
https://www.dropbox.com/s/n8eqv5ezqr1qqlp/loading.png
我的問題是:
是否有一個原因,爲什麼這個加載慢,什麼將減少加載時間的方法嗎?
我很少問服務器的元數據,一旦我走了。我快速從EntityManager的元數據存儲中導出元數據,並將其作爲全局變量轉儲到JavaScript文件中。我將其與我的其他腳本包含在我的index.html中。我在啓動時將此var加載到我的經理的metadateStore中。
隨着時間的推移,我越來越複雜,在服務器啓動時自動重新生成,序列化並將其存儲在瀏覽器本地存儲等中。一旦您意識到元數據只是一個JS對象,您就可以永遠保持密鑰。聰明。
感謝@Ward的答案。我也得出了這個結論,因爲數據庫結構不會改變,我把元數據作爲一個字符串保存到應用程序中正如我之前所說的,在我深入研究這個問題之後,我發現獲取元數據並不是那麼慢,而是實體框架的初始化,我使用實體框架5現在閱讀[this](http://entityframework.codeplex.com/discussions/396130)我正在考慮將EF升級到版本6 rc1。微風支持這個版本嗎? – razvanz
Breeze。包含EFContextProvider的網絡尚未轉換或測試尚未發佈的EF6。它可能會在某些已經改變的地方旅行。一般來說,我們不打擾MS產品即將發佈。我們處理和支持的流失太多了。 – Ward
@Ward:你有一個如何手動設置元數據的代碼示例,以便它不會嘗試從服務器加載它?我試圖使用'const metadataStore:MetadataStore = MetadataStore.importMetadata(元數據); const entityManagerConfig:EntityManagerOptions = { serviceName:「http:// localhost:63553」, metadataStore:metadataStore }; this.entityManager = new EntityManager(entityManagerConfig);',但它在執行查詢時仍會對元數據進行HTTP調用。請指教。 –
您可以避免在從服務器單獨的網絡調用中加載元數據的需求,方法是將其嵌入到腳本中,並按照@Ward提供的方式手動爲它提供Breeze。
下面是(我使用下面的打字稿):
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
實例與元數據並準備執行查詢初始化。
更多PVC門,看到official docs
從它的接縫的問題是在服務器上的截圖。如果這需要這麼長時間,那麼你可以在服務器上實現一些緩存機制。檢查第二個客戶端獲取元數據需要多長時間。 – pawel
我試圖用第二個客戶端獲取數據,但時間相同。我想也許有一種方法可以將元數據存儲在應用程序中的文件中,這樣我就可以避免對服務器的調用。 – razvanz
您可以將它作爲字符串存儲在靜態字段中。 – pawel