很多時候,為了提升性能,我們可以給數(shù)據(jù)庫訪問層做緩存。
以下幾步可以完成這個任務(wù):
1. 使用自定義的 XPObjectSpacePRovider
1.1. 創(chuàng)建自定義的 XPObjectSpaceProvider 類,派生類中需要重寫CreateDataLayer 方法去創(chuàng)建一個 IDataLayer 對象,連接到 DataCacheNode.
1.2. 讓XAF在 Xafapplication.CreateCustomObjectSpaceProvider 事件中,或重寫 theXafApplication.CreateDefaultObjectSpaceProvider 虛方法,文件在YourSolutionName/WxxApplication.xx 文件. 代碼差不多是這樣子的:
using DevExpress.ExpressApp.Xpo;using DevExpress.Xpo;using DevExpress.Xpo.DB;...public partial class SolutionWindowsFormsApplication : WxxApplication { //... protected override void CreateDefaultObjectSpaceProvider(CreateCustomObjectSpaceProviderEventArgs args) { args.ObjectSpaceProvider = new CachedObjectSpaceProvider(args.ConnectionString, args.Connection); }}...public class CachedObjectSpaceProvider : XPObjectSpaceProvider { public CachedObjectSpaceProvider(string connectionString, IDbConnection connection) : base(connectionString, connection) { } public CachedObjectSpaceProvider(string connectionString, IDbConnection connection, bool threadSafe) : base(connectionString, connection, threadSafe) { } protected override DevExpress.Xpo.IDataLayer CreateDataLayer(IDataStore workingDataStore) { DataCacheRoot cacheRoot = new DataCacheRoot(workingDataStore); DataCacheNode cacheNode = new DataCacheNode(cacheRoot); if (this.threadSafe) { return new ThreadSafeDataLayer(this.XPDictionary, cacheNode, new Assembly[0]); } return new SimpleDataLayer(this.XPDictionary, cacheNode); }}
以上文字是根據(jù)官方的翻譯的,這里是原文.
需要注意的是:這個緩存只能在web中使用,或者在如果你有多個web服務(wù)器連接到一臺DB時,也是不行的。
如有兩臺WEB,A,B 當(dāng)A做了修改數(shù)據(jù)行為后,B服務(wù)器并不知道這個數(shù)據(jù)庫中的數(shù)據(jù)已經(jīng)修改,所以B仍去緩存中讀取數(shù)據(jù)。
同樣的,Win程序的緩存是在客戶端電腦上的,所以也像多WEB一樣有問題。
我搜索了官方的解決方案:
當(dāng)使用了SqlServer時,可以用Service Broker 查詢通知服務(wù),進(jìn)行通知客戶端。這是一個方向。由于我考慮兼容性,比如用Oracle或是別的庫時也想有這個樣的功能,所以沒有用這個。
查詢通知服務(wù)的介紹,官方的方案。
當(dāng)然,如果你的web應(yīng)用只是在一臺服務(wù)器上部署就不用考慮這個問題了。
另外官方還提供了另一種方法:
2. 使用 CachedDataStoreService
你的應(yīng)用可以連接到數(shù)據(jù)緩存web services ,可以看這個鏈接: How to create a data caching service that helps improve performance in distributed applications 示例。
要做到這一點(diǎn),就必須在 XafApplication.ConnectionString 屬性中指定有效的服務(wù)(webservices 或wcf)路徑。
第2種方法不存在多服務(wù)器、win的緩存更新問題。這個感覺更好一些,不過一直沒有試過。
另外,說起性能問題,我曾經(jīng)遇到過win2008-win2012 比Win7 開發(fā)環(huán)境慢很多的現(xiàn)象,做了N個系統(tǒng)、經(jīng)過N天的實(shí)驗(yàn)發(fā)現(xiàn),原來是因?yàn)檫@些系統(tǒng)電源選項(xiàng)默認(rèn)為節(jié)能,修改為高性能后,效果顯著。
參見:
session Management and Caching
新聞熱點(diǎn)
疑難解答
圖片精選