中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識庫 > 《解剖PetShop》之四:PetShop之ASP.NET緩存

《解剖PetShop》之四:PetShop之ASP.NET緩存

熱門標簽:外呼電話機器人成本 蘇州如何辦理400電話 百應電話機器人外呼系統 臨沂智能電話機器人加盟 西寧呼叫中心外呼系統線路商 聯通官網400電話辦理 網絡電話外呼系統上海 400電話辦理怎么樣 地圖標注軟件免費下載

四 PetShop之ASP.NET緩存

  如果對微型計算機硬件系統有足夠的了解,那么我們對于Cache這個名詞一定是耳熟能詳的。在CPU以及主板的芯片中,都引入了這種名為高速緩沖存儲器(Cache)的技術。因為Cache的存取速度比內存快,因而引入Cache能夠有效的解決CPU與內存之間的速度不匹配問題。硬件系統可以利用Cache存儲CPU訪問概率高的那些數據,當CPU需要訪問這些數據時,可以直接從Cache中讀取,而不必訪問存取速度相對較慢的內存,從而提高了CPU的工作效率。軟件設計借鑒了硬件設計中引入緩存的機制以改善整個系統的性能,尤其是對于一個數據庫驅動的Web應用程序而言,緩存的利用是不可或缺的,畢竟,數據庫查詢可能是整個Web站點中調用最頻繁但同時又是執行最緩慢的操作之一,我們不能被它老邁的雙腿拖緩我們前進的征程。緩存機制正是解決這一缺陷的加速器。

4.1  ASP.NET緩存概述

  作為.Net框架下開發Web應用程序的主打產品,ASP.NET充分考慮了緩存機制。通過某種方法,將系統需要的數據對象、Web頁面存儲在內存中,使得Web站點在需要獲取這些數據時,不需要經過繁瑣的數據庫連接、查詢和復雜的邏輯運算,就可以“觸手可及”,如“探囊取物”般容易而快速,從而提高整個Web系統的性能。

  ASP.NET提供了兩種基本的緩存機制來提供緩存功能。一種是應用程序緩存,它允許開發者將程序生成的數據或報表業務對象放入緩存中。另外一種緩存機制是頁輸出緩存,利用它,可以直接獲取存放在緩存中的頁面,而不需要經過繁雜的對該頁面的再次處理。

  應用程序緩存其實現原理說來平淡無奇,僅僅是通過ASP.NET管理內存中的緩存空間。放入緩存中的應用程序數據對象,以鍵/值對的方式存儲,這便于用戶在訪問緩存中的數據項時,可以根據key值判斷該項是否存在緩存中。

  放入在緩存中的數據對象其生命周期是受到限制的,即使在整個應用程序的生命周期里,也不能保證該數據對象一直有效。ASP.NET可以對應用程序緩存進行管理,例如當數據項無效、過期或內存不足時移除它們。此外,調用者還可以通過CacheItemRemovedCallback委托,定義回調方法使得數據項被移除時能夠通知用戶。

  在.Net Framework中,應用程序緩存通過System.Web.Caching.Cache類實現。它是一個密封類,不能被繼承。對于每一個應用程序域,都要創建一個Cache類的實例,其生命周期與應用程序域的生命周期保持一致。我們可以利用Add或Insert方法,將數據項添加到應用程序緩存中,如下所示:

Cache["First"] = "First Item";
Cache.Insert("Second", "Second Item");

我們還可以為應用程序緩存添加依賴項,使得依賴項發生更改時,該數據項能夠從緩存中移除:

string[] dependencies = {"Second"};
Cache.Insert("Third", "Third Item",
new System.Web.Caching.CacheDependency(null, dependencies));

與之對應的是緩存中數據項的移除。前面提到ASP.NET可以自動管理緩存中項的移除,但我們也可以通過代碼編寫的方式顯式的移除相關的數據項:

Cache.Remove("First");

  相對于應用程序緩存而言,頁輸出緩存的應用更為廣泛。它可以通過內存將處理后的ASP.NET頁面存儲起來,當客戶端再一次訪問該頁面時,可以省去頁面處理的過程,從而提高頁面訪問的性能,以及Web服務器的吞吐量。例如,在一個電子商務網站里,用戶需要經常查詢商品信息,這個過程會涉及到數據庫訪問以及搜索條件的匹配,在數據量較大的情況下,如此的搜索過程是較為耗時的。此時,利用頁輸出緩存就可以將第一次搜索得到的查詢結果頁存儲在緩存中。當用戶第二次查詢時,就可以省去數據查詢的過程,減少頁面的響應時間。

  頁輸出緩存分為整頁緩存和部分頁緩存。我們可以通過@OutputCache指令完成對Web頁面的輸出緩存。它主要包含兩個參數:Duration和VaryByParam。Duration參數用于設置頁面或控件進行緩存的時間,其單位為秒。如下的設置表示緩存在60秒內有效:

%@ OutputCache Duration=“60“ VaryByParam=“none“ %>

  只要沒有超過Duration設置的期限值,當用戶訪問相同的頁面或控件時,就可以直接在緩存中獲取。
使用VaryByParam參數可以根據設置的參數值建立不同的緩存。例如在一個輸出天氣預報結果的頁面中,如果需要為一個ID為txtCity的TextBox控件建立緩存,其值將顯示某城市的氣溫,那么我們可以進行如下的設置:

%@ OutputCache Duration=”60” VaryByParam=”txtCity” %>

  如此一來,ASP.NET會對txtCity控件的值進行判斷,只有輸入的值與緩存值相同,才從緩存中取出相應的值。這就有效地避免了因為值的不同而導致輸出錯誤的數據。

  利用緩存的機制對性能的提升非常明顯。通過ACT(Application Center Test)的測試,可以發現設置緩存后執行的性能比未設置緩存時的性能足足提高三倍多。

  引入緩存看來是提高性能的“完美”解決方案,然而“金無足赤,人無完人”,緩存機制也有缺點,那就是數據過期的問題。一旦應用程序數據或者頁面結果值發生的改變,那么在緩存有效期范圍內,你所獲得的結果將是過期的、不準確的數據。我們可以想一想股票系統利用緩存所帶來的災難,當你利用錯誤過期的數據去分析股市的風云變幻時,你會發現獲得的結果真可以說是“失之毫厘,謬以千里”,看似大好的局面就會像美麗的泡沫一樣,用針一戳,轉眼就消失得無影無蹤。

  那么我們是否應該為了追求高性能,而不顧所謂“數據過期”所帶來的隱患呢?顯然,在類似于股票系統這種數據更新頻繁的特定場景下,數據過期的糟糕表現甚至比低效的性能更讓人難以接受。故而,我們需要在性能與數據正確性間作出權衡。所幸的是,.Net Framework 2.0引入了一種新的緩存機制,它為我們的“魚與熊掌兼得”帶來了技術上的可行性。

  .Net 2.0引入的自定義緩存依賴項,特別是基于MS-SQL Server的SqlCacheDependency特性,使得我們可以避免“數據過期”的問題,它能夠根據數據庫中相應數據的變化,通知緩存,并移除那些過期的數據。事實上,在PetShop 4.0中,就充分地利用了SqlCacheDependency特性。

4.2 SqlCacheDependency特性

  SqlCacheDependency特性實際上是通過System.Web.Caching.SqlCacheDependency類來體現的。通過該類,可以在所有支持的SQL Server版本(7.0,2000,2005)上監視特定的SQL Server數據庫表,并創建依賴于該表以及表中數據行的緩存項。當數據表或表中特定行的數據發生更改時,具有依賴項的數據項就會失效,并自動從Cache中刪除該項,從而保證了緩存中不再保留過期的數據。
由于版本的原因,SQL Server 2005完全支持SqlCacheDependency特性,但對于SQL Server 7.0和SQL Server 2000而言,就沒有如此幸運了。畢竟這些產品出現在.Net Framework 2.0之前,因此它并沒有實現自動監視數據表數據變化,通知ASP.NET的功能。解決的辦法就是利用輪詢機制,通過ASP.NET進程內的一個線程以指定的時間間隔輪詢SQL Server數據庫,以跟蹤數據的變化情況。

  要使得7.0或者2000版本的SQL Server支持SqlCacheDependency特性,需要對數據庫服務器執行相關的配置步驟。有兩種方法配置SQL Server:使用aspnet_regsql命令行工具,或者使用SqlCacheDependencyAdmin類。

4.2.1  利用aspnet_regsql工具

aspnet_regsql工具位于Windows\Microsoft.NET\Framework\[版本]文件夾中。如果直接雙擊該工具的執行文件,會彈出一個向導對話框,提示我們完成相應的操作:


圖4-1 aspnet_regsql工具

如圖4-1所示中的提示信息,說明該向導主要用于配置SQL Server數據庫,如membership,profiles等信息,如果要配置SqlCacheDependency,則需要以命令行的方式執行。以PetShop 4.0為例,數據庫名為MSPetShop4,則命令為:

aspnet_regsql -S localhost -E -d MSPetShop4 -ed

以下是該工具的命令參數說明:

-?  顯示該工具的幫助功能;
-S  后接的參數為數據庫服務器的名稱或者IP地址;
-U  后接的參數為數據庫的登陸用戶名;
-P  后接的參數為數據庫的登陸密碼;
-E  當使用windows集成驗證時,使用該功能;
-d  后接參數為對哪一個數據庫采用SqlCacheDependency功能;
-t  后接參數為對哪一個表采用SqlCacheDependency功能;
-ed  允許對數據庫使用SqlCacheDependency功能;
-dd  禁止對數據庫采用SqlCacheDependency功能;
-et  允許對數據表采用SqlCacheDependency功能;
-dt  禁止對數據表采用SqlCacheDependency功能;
-lt  列出當前數據庫中有哪些表已經采用sqlcachedependency功能。

  以上面的命令為例,說明將對名為MSPetShop4的數據庫采用SqlCacheDependency功能,且SQL Server采用了windows集成驗證方式。我們還可以對相關的數據表執行aspnet_regsql命令,如:

aspnet_regsql -S localhost -E -d MSPetShop4 -t Item -et
aspnet_regsql -S localhost -E -d MSPetShop4 -t Product -et
aspnet_regsql -S localhost -E -d MSPetShop4 -t Category -et

  當執行上述的四條命令后,aspnet_regsql工具會在MSPetShop4數據庫中建立一個名為AspNet_SqlCacheTablesForChangeNotification的新數據庫表。該數據表包含三個字段。字段tableName記錄要追蹤的數據表的名稱,例如在PetShop 4.0中,要記錄的數據表就包括Category、Item和Product。notificationCreated字段記錄開始追蹤的時間。changeId作為一個類型為int的字段,用于記錄數據表數據發生變化的次數。如圖4-2所示:


圖4-2 AspNet_SqlCacheTablesForChangeNotification數據表

  除此之外,執行該命令還會為MSPetShop4數據庫添加一組存儲過程,為ASP.NET提供查詢追蹤的數據表的情況,同時還將為使用了SqlCacheDependency的表添加觸發器,分別對應Insert、Update、Delete等與數據更改相關的操作。例如Product數據表的觸發器:

CREATE TRIGGER dbo.[Product_AspNet_SqlCacheNotification_Trigger] ON [Product]
 FOR INSERT, UPDATE, DELETE AS BEGIN
 SET NOCOUNT ON
 EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N'Product'
END

其中,AspNet_SqlCacheUpdateChangeIdStoredProcedure即是工具添加的一組存儲過程中的一個。當對Product數據表執行Insert、Update或Delete等操作時,就會激活觸發器,然后執行AspNet_SqlCacheUpdateChangeIdStoredProcedure存儲過程。其執行的過程就是修改AspNet_SqlCacheTablesForChangeNotification數據表的changeId字段值:

CREATE PROCEDURE dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure
 @tableName NVARCHAR(450)
 AS
 BEGIN
 UPDATE dbo.AspNet_SqlCacheTablesForChangeNotification WITH (ROWLOCK) SET changeId = changeId + 1
 WHERE tableName = @tableName
 END 
GO

4.2.2  利用SqlCacheDependencyAdmin類

我們也可以利用編程的方式來來管理數據庫對SqlCacheDependency特性的使用。該類包含了五個重要的方法:

DisableNotifications
為特定數據庫禁用 SqlCacheDependency對象更改通知
DisableTableForNotifications
為數據庫中的特定表禁用SqlCacheDependency對象更改通知
EnableNotifications
為特定數據庫啟用SqlCacheDependency對象更改通知
EnableTableForNotifications
為數據庫中的特定表啟用SqlCacheDependency對象更改通知
GetTablesEnabledForNotifications
返回啟用了SqlCacheDependency對象更改通知的所有表的列表

表4-1 SqlCacheDependencyAdmin類的主要方法

假設我們定義了如下的數據庫連接字符串:

const string connectionStr = "Server=localhost;Database=MSPetShop4";

那么為數據庫MSPetShop4啟用SqlCacheDependency對象更改通知的實現為:

protected void Page_Load(object sender, EventArgs e)
{
 if (!IsPostBack)
 {
 SqlCacheDependencyAdmin.EnableNotifications(connectionStr);
 }
}

為數據表Product啟用SqlCacheDependency對象更改通知的實現則為:

SqlCacheDependencyAdmin.EnableTableForNotifications(connectionStr, "Product");

  如果要調用表4-1中所示的相關方法,需要注意的是訪問SQL Server數據庫的帳戶必須具有創建表和存儲過程的權限。如果要調用EnableTableForNotifications方法,還需要具有在該表上創建SQL Server觸發器的權限。

  雖然說編程方式賦予了程序員更大的靈活性,但aspnet_regsql工具卻提供了更簡單的方法實現對SqlCacheDependency的配置與管理。PetShop 4.0采用的正是aspnet_regsql工具的辦法,它編寫了一個文件名為InstallDatabases.cmd的批處理文件,其中包含了對aspnet_regsql工具的執行,并通過安裝程序去調用該文件,實現對SQL Server的配置。

4.3 在PetShop 4.0中ASP.NET緩存的實現

  PetShop作為一個B2C的寵物網上商店,需要充分考慮訪客的用戶體驗,如果因為數據量大而導致Web服務器的響應不及時,頁面和查詢數據遲遲得不到結果,會因此而破壞客戶訪問網站的心情,在耗盡耐心的等待后,可能會失去這一部分客戶。無疑,這是非常糟糕的結果。因而在對其進行體系架構設計時,整個系統的性能就顯得殊為重要。然而,我們不能因噎廢食,因為專注于性能而忽略數據的正確性。在PetShop 3.0版本以及之前的版本,因為ASP.NET緩存的局限性,這一問題并沒有得到很好的解決。PetShop 4.0則引入了SqlCacheDependency特性,使得系統對緩存的處理較之以前大為改觀。

4.3.1  CacheDependency接口

  PetShop 4.0引入了SqlCacheDependency特性,對Category、Product和Item數據表對應的緩存實施了SQL Cache Invalidation技術。當對應的數據表數據發生更改后,該技術能夠將相關項從緩存中移除。實現這一技術的核心是SqlCacheDependency類,它繼承了CacheDependency類。然而為了保證整個架構的可擴展性,我們也允許設計者建立自定義的CacheDependency類,用以擴展緩存依賴。這就有必要為CacheDependency建立抽象接口,并在web.config文件中進行配置。

  在PetShop 4.0的命名空間PetShop.ICacheDependency中,定義了名為IPetShopCacheDependency接口,它僅包含了一個接口方法:

public interface IPetShopCacheDependency
{ 
 AggregateCacheDependency GetDependency();
}

  AggregateCacheDependency是.Net Framework 2.0新增的一個類,它負責監視依賴項對象的集合。當這個集合中的任意一個依賴項對象發生改變時,該依賴項對象對應的緩存對象都將被自動移除。

  AggregateCacheDependency類起到了組合CacheDependency對象的作用,它可以將多個CacheDependency對象甚至于不同類型的CacheDependency對象與緩存項建立關聯。由于PetShop需要為Category、Product和Item數據表建立依賴項,因而IPetShopCacheDependency的接口方法GetDependency()其目的就是返回建立了這些依賴項的AggregateCacheDependency對象。

4.3.2  CacheDependency實現

CacheDependency的實現正是為Category、Product和Item數據表建立了對應的SqlCacheDependency類型的依賴項,如代碼所示:

public abstract class TableDependency : IPetShopCacheDependency
{
 // This is the separator that's used in web.config
 protected char[] configurationSeparator = new char[] { ',' };

 protected AggregateCacheDependency dependency = new AggregateCacheDependency();
 protected TableDependency(string configKey)
 {
 string dbName = ConfigurationManager.AppSettings["CacheDatabaseName"];
 string tableConfig = ConfigurationManager.AppSettings[configKey];
 string[] tables = tableConfig.Split(configurationSeparator);

 foreach (string tableName in tables)
  dependency.Add(new SqlCacheDependency(dbName, tableName));
 }
 public AggregateCacheDependency GetDependency()
 {
 return dependency;
 }
}

需要建立依賴項的數據庫與數據表都配置在web.config文件中,其設置如下:

add key="CacheDatabaseName" value="MSPetShop4"/>
add key="CategoryTableDependency" value="Category"/>
add key="ProductTableDependency" value="Product,Category"/>
add key="ItemTableDependency" value="Product,Category,Item"/>

  根據各個數據表間的依賴關系,因而不同的數據表需要建立的依賴項也是不相同的,從配置文件中的value值可以看出。然而不管建立依賴項的多寡,其創建的行為邏輯都是相似的,因而在設計時,抽象了一個共同的類TableDependency,并通過建立帶參數的構造函數,完成對依賴項的建立。由于接口方法GetDependency()的實現中,返回的對象dependency是在受保護的構造函數創建的,因此這里的實現方式也可以看作是Template Method模式的靈活運用。例如TableDependency的子類Product,就是利用父類的構造函數建立了Product、Category數據表的SqlCacheDependency依賴:

public class Product : TableDependency
{
 public Product() : base("ProductTableDependency") { }
}

  如果需要自定義CacheDependency,那么創建依賴項的方式又有不同。然而不管是創建SqlCacheDependency對象,還是自定義的CacheDependency對象,都是將這些依賴項添加到AggregateCacheDependency類中,因而我們也可以為自定義CacheDependency建立專門的類,只要實現IPetShopCacheDependency接口即可。

4.3.3  CacheDependency工廠

  繼承了抽象類TableDependency的Product、Category和Item類均需要在調用時創建各自的對象。由于它們的父類TableDependency實現了接口IPetShopCacheDependency,因而它們也間接實現了IPetShopCacheDependency接口,這為實現工廠模式提供了前提。

  在PetShop 4.0中,依然利用了配置文件和反射技術來實現工廠模式。命名空間PetShop.CacheDependencyFactory中,類DependencyAccess即為創建IPetShopCacheDependency對象的工廠類:

public static class DependencyAccess
{ 
 public static IPetShopCacheDependency CreateCategoryDependency()
 {
 return LoadInstance("Category");
 }
 public static IPetShopCacheDependency CreateProductDependency()
 {
 return LoadInstance("Product");
 }
 public static IPetShopCacheDependency CreateItemDependency()
 {
 return LoadInstance("Item");
 }
 private static IPetShopCacheDependency LoadInstance(string className)
 {
 string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
 string fullyQualifiedClass = path + "." + className;
 return (IPetShopCacheDependency)Assembly.Load(path).CreateInstance(fullyQualifiedClass);
 }
}

整個工廠模式的實現如圖4-3所示:


圖4-3 CacheDependency工廠

  雖然DependencyAccess類創建了實現了IPetShopCacheDependency接口的類Category、Product、Item,然而我們之所以引入IPetShopCacheDependency接口,其目的就在于獲得創建了依賴項的    AggregateCacheDependency類型的對象。我們可以調用對象的接口方法GetDependency(),如下所示:

AggregateCacheDependency dependency = DependencyAccess.CreateCategoryDependency().GetDependency();

  為了方便調用者,似乎我們可以對DependencyAccess類進行改進,將原有的CreateCategoryDependency()方法,修改為創建AggregateCacheDependency類型對象的方法。

  然而這樣的做法擾亂了作為工廠類的DependencyAccess的本身職責,且創建IPetShopCacheDependency接口對象的行為仍然有可能被調用者調用,所以保留原有的DependencyAccess類仍然是有必要的。

  在PetShop 4.0的設計中,是通過引入Facade模式以方便調用者更加簡單地獲得AggregateCacheDependency類型對象。

4.3.4  引入Facade模式

  利用Facade模式可以將一些復雜的邏輯進行包裝,以方便調用者對這些復雜邏輯的調用。就好像提供一個統一的門面一般,將內部的子系統封裝起來,統一為一個高層次的接口。一個典型的Facade模式示意圖如下所示:


圖4-4 Facade模式

  Facade模式的目的并非要引入一個新的功能,而是在現有功能的基礎上提供一個更高層次的抽象,使得調用者可以直接調用,而不用關心內部的實現方式。以CacheDependency工廠為例,我們需要為調用者提供獲得AggregateCacheDependency對象的簡便方法,因而創建了DependencyFacade類:

public static class DependencyFacade
{
 private static readonly string path = ConfigurationManager.AppSettings["CacheDependencyAssembly"];
 public static AggregateCacheDependency GetCategoryDependency()
 {
 if (!string.IsNullOrEmpty(path))
  return DependencyAccess.CreateCategoryDependency().GetDependency();
 else
  return null;
 }
 public static AggregateCacheDependency GetProductDependency()
 {
 if (!string.IsNullOrEmpty(path))
  return DependencyAccess.CreateProductDependency().GetDependency();
 else
  return null;
 }
 public static AggregateCacheDependency GetItemDependency()
 {
 if (!string.IsNullOrEmpty(path))
  return DependencyAccess.CreateItemDependency().GetDependency();
 else
  return null;
 }
}

  DependencyFacade類封裝了獲取AggregateCacheDependency類型對象的邏輯,如此一來,調用者可以調用相關方法獲得創建相關依賴項的AggregateCacheDependency類型對象:

AggregateCacheDependency dependency = DependencyFacade.GetCategoryDependency();

  比起直接調用DependencyAccess類的GetDependency()方法而言,除了方法更簡單之外,同時它還對CacheDependencyAssembly配置節進行了判斷,如果其值為空,則返回null對象。

  在PetShop.Web的App_Code文件夾下,靜態類WebUtility的GetCategoryName()和GetProductName()方法調用了DependencyFacade類。例如GetCategoryName()方法:

public static string GetCategoryName(string categoryId)
{
 Category category = new Category();
 if (!enableCaching)
  return category.GetCategory(categoryId).Name;

 string cacheKey = string.Format(CATEGORY_NAME_KEY, categoryId);

 // 檢查緩存中是否存在該數據項;
 string data = (string)HttpRuntime.Cache[cacheKey];
 if (data == null)
 {
  // 通過web.config的配置獲取duration值;
  int cacheDuration = int.Parse(ConfigurationManager.AppSettings["CategoryCacheDuration"]);
  // 如果緩存中不存在該數據項,則通過業務邏輯層訪問數據庫獲取;
  data = category.GetCategory(categoryId).Name;
  // 通過Facade類創建AggregateCacheDependency對象;
  AggregateCacheDependency cd = DependencyFacade.GetCategoryDependency();
  // 將數據項以及AggregateCacheDependency 對象存儲到緩存中;
  HttpRuntime.Cache.Add(cacheKey, data, cd, DateTime.Now.AddHours(cacheDuration), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
 }
 return data;
}

  GetCategoryName()方法首先會檢查緩存中是否已經存在CategoryName數據項,如果已經存在,就通過緩存直接獲取數據;否則將通過業務邏輯層調用數據訪問層訪問數據庫獲得CategoryName,在獲得了CategoryName后,會將新獲取的數據連同DependencyFacade類創建的AggregateCacheDependency對象添加到緩存中。

  WebUtility靜態類被表示層的許多頁面所調用,例如Product頁面:

public partial class Products : System.Web.UI.Page
{
 protected void Page_Load(object sender, EventArgs e)
 {
 Page.Title = WebUtility.GetCategoryName(Request.QueryString["categoryId"]);
 }
}

  顯示頁面title的邏輯是放在Page_Load事件方法中,因而每次打開該頁面都要執行獲取CategoryName的方法。如果沒有采用緩存機制,當Category數據較多時,頁面的顯示就會非常緩慢。

4.3.5  引入Proxy模式

  業務邏輯層BLL中與Product、Category、Item有關的業務方法,其實現邏輯是調用數據訪問層(DAL)對象訪問數據庫,以獲取相關數據。為了改善系統性能,我們就需要為這些實現方法增加緩存機制的邏輯。當我們操作增加了緩存機制的業務對象時,對于調用者而言,應與BLL業務對象的調用保持一致。也即是說,我們需要引入一個新的對象去控制原來的BLL業務對象,這個新的對象就是Proxy模式中的代理對象。

  以PetShop.BLL.Product業務對象為例,PetShop為其建立了代理對象ProductDataProxy,并在GetProductByCategory()等方法中,引入了緩存機制,例如:

public static class ProductDataProxy
{

 private static readonly int productTimeout = int.Parse(ConfigurationManager.AppSettings["ProductCacheDuration"]);
 private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings["EnableCaching"]);
 
 public static IList
GetProductsByCategory(string category)
 {
 Product product = new Product();

 if (!enableCaching)
  return product.GetProductsByCategory(category);

 string key = "product_by_category_" + category;
 IList data = (IList )HttpRuntime.Cache[key];

 // Check if the data exists in the data cache
 if (data == null)
 {
  data = product.GetProductsByCategory(category);

  // Create a AggregateCacheDependency object from the factory
  AggregateCacheDependency cd = DependencyFacade.GetProductDependency();

  // Store the output in the data cache, and Add the necessary AggregateCacheDependency object
  HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(productTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
 }
 return data;
 }
}

  與業務邏輯層Product對象的GetProductsByCategory()方法相比,增加了緩存機制。當緩存內不存在相關數據項時,則直接調用業務邏輯層Product的GetProductsByCategory()方法來獲取數據,并將其與對應的AggregateCacheDependency對象一起存儲在緩存中。

  引入Proxy模式,實現了在緩存級別上對業務對象的封裝,增強了對業務對象的控制。由于暴露在對象外的方法是一致的,因而對于調用方而言,調用代理對象與真實對象并沒有實質的區別。

  從職責分離與分層設計的角度分析,我更希望這些Proxy對象是被定義在業務邏輯層中,而不像在PetShop的設計那樣,被劃分到表示層UI中。此外,如果需要考慮程序的可擴展性與可替換性,我們還可以為真實對象與代理對象建立統一的接口或抽象類。然而,單以PetShop的表示層調用來看,采用靜態類與靜態方法的方式,或許更為合理。我們需要謹記,“過度設計”是軟件設計的警戒線。

  如果需要對UI層采用緩存機制,將應用程序數據存放到緩存中,就可以調用這些代理對象。以ProductsControl用戶控件為例,調用方式如下:

productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);

  productsList對象屬于自定義的CustomList類型,這是一個派生自System.Web.UI.WebControls.DataList控件的類,它的DataSource屬性可以接受IList集合對象。
不過在PetShop 4.0的設計中,對于類似于ProductsControl類型的控件而言,采用的緩存機制是頁輸出緩存。我們可以從ProductsControl.ascx頁面的Source代碼中發現端倪:

%@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>

  與ASP.NET 1.x的頁輸出緩存不同的是,在ASP.NET 2.0中,為ASP.NET用戶控件新引入了CachePolicy屬性,該屬性的類型為ControlCachePolicy類,它以編程方式實現了對ASP.NET用戶控件的輸出緩存設置。我們可以通過設置ControlCachePolicy類的Dependency屬性,來設置與該用戶控件相關的依賴項,例如在ProductsControl用戶控件中,進行如下的設置:

protected void Page_Load(object sender, EventArgs e)
{
 this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();
}

  采用頁輸出緩存,并且利用ControlCachePolicy設置輸出緩存,能夠將業務數據與整個頁面放入到緩存中。這種方式比起應用程序緩存而言,在性能上有很大的提高。同時,它又通過引入的SqlCacheDependency特性有效地避免了“數據過期”的缺點,因而在PetShop 4.0中被廣泛采用。相反,之前為Product、Category、Item業務對象建立的代理對象則被“投閑散置”,僅僅作為一種設計方法的展示而“幸存”與整個系統的源代碼中。

以上就是PetShop中ASP.NET緩存全部內容,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 學會sql數據庫關系圖(Petshop)
  • 《解剖PetShop》之一:PetShop的系統架構設計
  • 《解剖PetShop》之二:PetShop數據訪問層數之據庫訪問設計
  • 《解剖PetShop》之三:PetShop數據訪問層之消息處理
  • 《解剖PetShop》之五:PetShop之業務邏輯層設計
  • 《解剖PetShop》之六:PetShop之表示層設計

標簽:慶陽 聊城 海西 中衛 甘肅 臨夏 平涼 清遠

巨人網絡通訊聲明:本文標題《《解剖PetShop》之四:PetShop之ASP.NET緩存》,本文關鍵詞  解剖PetShop,之四,PetShop,之,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《《解剖PetShop》之四:PetShop之ASP.NET緩存》相關的同類信息!
  • 本頁收集關于《解剖PetShop》之四:PetShop之ASP.NET緩存的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 河北神耕机械有限公司| 新金山钢铁有限公司| 佛山市创利宝包装机械有限公司| 广西玉柴重工有限公司| 烟台工程机械有限公司| 杭州科豪机械有限公司| 常州斯塔克机械设备有限公司| 苏州凯尔博精密机械有限公司| 明辉机械设备制造有限公司| 沧州沧狮磨浆机械有限公司| 大连典石精密机械有限公司| 荣精密机械有限公司| 青岛青科重工有限公司| 青岛仕诚塑料机械有限公司| 江苏优远机械有限公司| 创宝包装机械有限公司| 马鞍山 机械制造有限公司| 威海石岛重工有限公司| 宁夏瑞光机械有限公司| 浙江新立机械有限公司| 苏州孚杰机械有限公司| 上海佳力士机械有限公司| 广州力丰机械有限公司| 中山中炬精工机械有限公司 | 厦门机械工业有限公司| 江西龙工机械有限公司| 天盛机械制造有限公司| 济南华工液压机械有限公司 | 瑞安市机械制造有限公司| 郑州一正重工机械有限公司 | 机械加工 有限公司| 华泰机械制造有限公司| 杭州汽轮机械设备有限公司| 上海机械施工有限公司| 昆山美和机械有限公司| 上海京悦机械有限公司| 武汉中粮机械有限公司| 洛阳易高机械有限公司| 河北金鼎钢铁有限公司| 温岭联星机械有限公司| 浙江启博机械有限公司| 烟台海州机械有限公司| 重庆驰骋机械有限公司| 福建三联机械有限公司| 广州市三禾机械有限公司| 北京市机械施工有限公司| 重庆科邦机械有限公司| 上海冠隆阀门机械有限公司| 宝鸡南车时代工程机械有限公司 | 青岛北船重工有限公司| 厦门升正机械有限公司| 宁波恒威机械有限公司| 天津华信机械有限公司| 珠海飞马传动机械有限公司| 富江机械制造有限公司| 江苏三麦食品机械有限公司| 星塔机械深圳有限公司| 湖南星邦重工有限公司| 河南龙昌机械制造有限公司| 雅康精密机械有限公司| 龙腾机械制造有限公司| 河南起重设备有限公司| 青岛明高机械有限公司| 山东临工工程机械有限公司招聘| 浙江铖虹机械有限公司| 中航起落架有限公司| 立信染整机械深圳有限公司| 南通牧野机械有限公司| 唐山化工机械有限公司| 广东仕诚塑料机械有限公司| 河南工程机械有限公司| 天津钢铁贸易有限公司| 浙江美华包装机械有限公司| 江阴市中立机械工业有限公司 | 温州贝诺机械有限公司| 陕西鑫辉钢铁有限公司| 合肥华运机械制造有限公司 | 上海 马机械有限公司| 山鑫矿山机械有限公司| 宝鸡 机械有限公司| 昆山市烽禾升精密机械有限公司| 青岛博朗特机械设备有限公司 | 常州奥恒机械有限公司| 东泰机械制造有限公司| 江苏锐成机械有限公司| 昆山机械设备有限公司| 宁波壬鼎机械有限公司| 临沂正大机械有限公司| 上海京雅机械有限公司| 杭州 机械设备有限公司| 河南耿力支护机械设备有限公司| 佛山市洛德机械设备有限公司| 东莞凯格精密机械有限公司 | 昆山胜代机械有限公司招聘| 山西建龙钢铁有限公司地址| 杭州宏展机械有限公司| 江苏坤泰机械有限公司| 盐城益聚达机械有限公司| 陕西金奇机械电器制造有限公司 | 山东金大丰机械有限公司| 百事德机械江苏有限公司| 九江%机械有限公司| 印刷包装机械有限公司| 东莞亮剑机械有限公司| 北京机械制造有限公司| 机械设计 有限公司| 福州协展机械有限公司| 唐山宏润钢铁有限公司| 普瑞特机械有限公司| 河南省金特振动机械有限公司 | 张家口煤机械有限公司| 温州市顺达服装机械有限公司| 郑州明瑞机械设备有限公司| 永明机械制造有限公司| 深圳市包装机械有限公司| 烟台瑞进精密机械有限公司| 广东华鼎机械有限公司| 上海电工机械有限公司| 江西鑫通机械有限公司| 丹阳龙江钢铁有限公司| 西安普阳机械有限公司| 邯郸纺织机械有限公司| 江 诚机械有限公司| 无锡东源机械制造有限公司 | 河北坤达起重设备有限公司 | 滕州市美力机械有限公司| 佛山三技精密机械有限公司| 青岛非凡包装机械有限公司| 新乡市中天机械有限公司| 江苏汤姆包装机械有限公司| 杭州 机械有限公司| 南通艾迈特机械有限公司| 唐山鑫杭钢铁有限公司| 山西翔天钢铁有限公司| 温州锐光机械有限公司| 浙江纺织机械有限公司| 佛山突破机械有限公司| 衡阳运输机械有限公司| 苏州德派机械有限公司| 广西柳工机械有限公司| 洛阳美卓重工机械有限公司 | 北京大森包装机械有限公司| 济南欧亚德数控机械有限公司| 杭州通绿机械有限公司| 德国arku机械制造有限公司| 浙江大鹏机械有限公司| 兴鑫钢铁有限公司电话| 天津国际机械有限公司| 佛山市钲昌机械设备有限公司 | 佛山市信虹精密机械有限公司| 温州科瑞机械有限公司| 佛山市南海鼎工包装机械有限公司| 重庆捷灿机械有限公司| 恒兴兴业机械有限公司| 山东建昌机械有限公司| 昆山乙盛机械工业有限公司电话| 江苏冠宇机械设备制造有限公司| 张家口煤矿机械制造有限公司| 东莞市自动化机械有限公司| 韩通船舶重工有限公司| 潍坊元鸣机械有限公司| 东台市机械有限公司| 江阴凯澄起重机械有限公司| 江苏银河机械有限公司| 南阳市 机械有限公司| 上海楚尚机械有限公司| 河南 机械设备有限公司| 卓郎纺织机械有限公司| 山东博杰重型工程机械有限公司| 上海 坚机械有限公司| 深圳华盛昌机械实业有限公司| 扬州涂装机械有限公司| 无锡市浦尚精密机械有限公司 | 成都经纬机械制造有限公司| 柳州中源机械有限公司| 杭州重型机械有限公司| 山东骏腾起重设备有限公司| 上海瀚艺冷冻机械有限公司 | 大连东拓工程机械制造有限公司| 河南北工机械制造有限公司| 江苏东钢钢铁有限公司| 力升机械有限公司.| 台州工交机械有限公司| 江西晟浔机械有限公司| 山东诸城机械有限公司| 东莞豪力机械有限公司| 上海御流包装机械有限公司 | 南京宏伟屠宰机械制造有限公司 | 钜业机械设备有限公司| 江阴 机械制造有限公司| 常熟神马机械有限公司| 乐陵双鹤机械制造有限公司| 台州万州机械有限公司| 常州光明包装机械有限公司| 无锡宝业机械有限公司| 恒兴兴业机械有限公司| 新疆昆玉钢铁有限公司| 济南四通机械有限公司| 诸城市华邦机械有限公司| 曲阜市机械有限公司| 河南长城机械有限公司| 青岛高通机械有限公司| 哈尔滨联科包装机械有限公司| 青岛万邦包装机械有限公司| 万金机械配件有限公司| 济南天助升降机械有限公司| 东莞市金联吹塑机械有限公司 | 马鞍山 机械有限公司| 天津中核机械有限公司| 昆山富邦机械有限公司| 范县中鑫钢铁有限公司| 佛山市鹏轩机械制造有限公司| 唐山机械设备有限公司| 江苏同力机械有限公司| 江苏瀚皋机械有限公司| 郑州龙阳重型机械设备有限公司 | 西安 工程机械有限公司| 厦门众达钢铁有限公司| 辽宁春光机械有限公司| 山东瑞华工程机械有限公司 | 湖北华伟石化机械设备制造有限公司 | 扬州 机械 有限公司| 上海港机重工有限公司| 四平现代钢铁有限公司| 上海佳力士机械有限公司| 永宏机械制造有限公司| 上海嘉歆包装机械有限公司 | 恒昌机械制造有限公司| 无锡名震机械制造有限公司 | 山东机械 有限公司| 曲阜机械设备有限公司| 昆山裕邦机械有限公司| 上海乾承机械设备有限公司| 河北犀牛民用机械有限公司| 上海应晓食品机械有限公司| 苏州金德纬机械有限公司| 唐山机械制造有限公司| 玉环博机械有限公司| 涿州北方重工设备设计有限公司| 唐山瑞兴钢铁有限公司| 徐州博丰钢铁有限公司| 常州远见机械有限公司| 上海国豪机械制造有限公司| 郑州华隆机械有限公司| 上海荣沃机械有限公司| 温州市顺达服装机械有限公司 | 苏州纺织机械有限公司| 广州华运机械有限公司| 天津京龙工程机械有限公司| 鲁山万通通机械制造有限公司| 重庆卡滨通用机械有限公司| 杭州德智机械有限公司| 成都杰瑞达工程机械有限公司| 温州市友田包装机械有限公司| 北京 机械 有限公司| 上海徽机械有限公司| 东莞市东机械设备有限公司| 宁波市北仑机械制造有限公司 | 青岛青宏机械制造有限公司| 重庆远风机械有限公司| 海益机械配件有限公司| 安徽正元机械有限公司| 扬州中孚机械有限公司| 吉川机械设备有限公司| 济南达润机械有限公司| 皋兰兰鑫钢铁有限公司| 青岛九合重工机械有限公司| 浙江机械有限公司招聘信息| 滕州市美力机械有限公司| 杭州驰耐传动机械有限公司| 西安冠杰机械设备有限公司 | 重型机械设备有限公司| 安徽 机械制造有限公司| 东阳机械设备制造有限公司| 吉林小松工程机械有限公司| 上海路桥机械有限公司| 化工有限公司起名大全| 上海齐耀螺杆机械有限公司| 无锡精派机械有限公司| 济南钢铁 有限公司| 淄博协丰机械有限公司| 河南江瀚机械制造有限公司| 东莞市通盛机械有限公司| 高臻机械设备有限公司| 山西万泽锦达机械制造有限公司| 合肥旭龙机械有限公司| 沧州机械制造有限公司| 洛阳中收机械装备有限公司招聘 | 昆明机械设备有限公司| 泉州泉盛机械有限公司| 上海铮潼起重机电设备有限公司 | 青岛科尼乐重工有限公司| 苏州松发机械有限公司| 首钢长白机械有限公司| 佛山玻璃机械有限公司| 金瑞机械制造有限公司| 世翔精密机械制造有限公司| 威海华丰机械有限公司| 上海鼎亚精密机械设备有限公司| 宁波星源机械有限公司| 宁波机械设备有限公司| 深圳市 机械 有限公司| 万兹莱压缩机械(上海)有限公司| 苏州一工机械有限公司| 苏州苏媛爱德克机械有限公司| 郑州郑瑞机械有限公司| 广州起重机械有限公司招聘| 日照立盈机械有限公司| 新乡市先锋振动机械有限公司| 武汉包装机械有限公司| 广东森人机械有限公司| 铜陵市富鑫钢铁有限公司| 山东泗水鑫峰面粉机械有限公司 | 德州联合石油机械有限公司 | 苏州德派机械有限公司| 三门峡化工机械有限公司| 北京工程机械有限公司| 宁波佳利来机械制造有限公司| 厦门众达钢铁有限公司| 沈阳三重机械有限公司| 上海德耐尔压缩机械有限公司 | 天津千百顺钢铁贸易有限公司| 河南乾坤工程机械有限公司| 扬州中孚机械有限公司| 扬州市机械制造有限公司| 江西晟浔机械有限公司| 高博起重设备有限公司| 苏州勤美达精密机械有限公司| 久隆久兴机械有限公司| 潍坊华星机械有限公司| 兴龙机械模具有限公司| 山东海宏重工有限公司| 东莞市台旺机械有限公司| 苏州工业园区嘉宝精密机械有限公司 | 安丘博阳机械制造有限公司| 太仓九本机械有限公司| 苏州松博机械有限公司| 常州欧鹰焊割机械有限公司| 湖南长河机械有限公司| 江阴 机械制造有限公司| 沈阳维用精密机械有限公司| 济南建设机械有限公司| 深圳市德润机械有限公司| 无锡双益精密机械有限公司| 山东润通机械制造有限公司| 大连仁海重工有限公司| 光大机械厂有限公司| 浙江超洋机械有限公司| 青岛欧普机械设备有限公司| 河北正大机械有限公司| 常州创领机械有限公司| 芜湖科翔动力机械有限公司| 恒兴机械设备有限公司| 富世华机械有限公司| 杭州萧山凯兴食品机械有限公司| 浙江临海机械有限公司| 洛阳泽华机械设备有限公司 | 新乡市法斯特机械有限公司| 广州通泽机械有限公司| 安徽中晨机械有限公司| 上海敏硕机械配件有限公司| 溧阳三元钢铁有限公司| 泉州恒泉机械有限公司| 山东兴田机械有限公司| 农友机械设备有限公司| 湖北天和机械有限公司| 广州东昻机械有限公司| 安阳嘉和机械有限公司| 广州九盈机械有限公司| 东莞市得士威机械工业有限公司 | 广州赛威机械有限公司| 浙江志高机械有限公司| 临沂三友重工有限公司| 昆山乔地精密机械有限公司| 合肥旭龙机械有限公司| 艾莎钢铁天津有限公司| 沈阳 机械 有限公司| 佛山市机械设备有限公司| 上海汉享食品机械有限公司| 辽宁富一机械有限公司| 上海山冠机械有限公司| 重庆旺田机械有限公司| 潍坊裕川机械有限公司| 广东万联包装机械有限公司| 苏州联又机械有限公司| 首钢东华机械有限公司| 开封市茂盛粮食机械有限公司| 山东鲁丽钢铁有限公司| 东莞市兆恒机械有限公司| 德州联合石油机械有限公司| 富世华机械有限公司| 天马电子机械有限公司| 上海巨能减速机械有限公司| 机械化工程有限公司| 杭州恒宏机械有限公司| 东方传动机械有限公司| 宁夏天地奔牛银起设备有限公司| 山东米科思机械设备有限公司| 沈阳三洋建筑机械有限公司| 安徽联塔盛通机械制造有限公司 | 南京阿特拉斯机械设备有限公司| 秦皇岛安丰钢铁有限公司| 新乡天丰机械有限公司| 上海奕晟矿山机械有限公司| 射阳 机械有限公司| 安阳新普钢铁有限公司| 苏州鸿安机械有限公司| 郑州鑫宇机械制造有限公司| 重庆智茂机械制造有限公司| 枣庄誉源挂车机械有限公司| 绍兴 机械 有限公司| 山东浩信机械有限公司| 三益精密机械有限公司| 天马电子机械有限公司| 台州亚格机械有限公司| 江苏谷登工程机械装备有限公司 | 安丰钢铁有限公司地址| 慈溪 机械 有限公司| 无锡机械制造有限公司| 国机重工洛阳有限公司| 扬州恒润钢铁有限公司| 长沙起重机厂有限公司| 郑州明瑞机械设备有限公司| 昆山鹤鑫精密机械有限公司| 念朋机械设备有限公司| 青岛悦工机械有限公司| 玉环县机械有限公司| 首钢长治钢铁有限公司| 大连世达重工有限公司| 莱州三和机械有限公司| 三国精密机械有限公司| 宁波联成机械有限公司| 太仓健柏机械有限公司| 张家港市贝尔机械有限公司| 江阴惠尔信机械有限公司| 柳州恒瑞机械有限公司| 青岛吉瑞特机械制造有限公司| 武汉市快诚机械有限公司| 安徽 机械设备有限公司| 杭州精工机械有限公司| 永腾弹簧机械设备有限公司| 海沃机械扬州有限公司| 中石化机械有限公司| 江苏瑞德机械有限公司| 太行机械工业有限公司| 东莞巨冈机械有限公司| 江苏天宇机械有限公司| 上海尼法机械有限公司| 苏州全彩机械设备有限公司| 小松工程机械有限公司| 新宝泰钢铁有限公司| 陕西重型机械制造有限公司| 深圳固尔琦包装机械有限公司| 金昶泰机械设备有限公司 | 唐山市德龙钢铁有限公司| 广汉市蜀汉粮油机械有限公司| 成都欧曼机械有限公司| 中船重工环境工程有限公司怎么样| 苏州诚亚机械有限公司| 江苏天泽精工机械有限公司| 诺曼艾索机械技术(北京)有限公司| 武汉鑫巨力精密机械制造有限公司 | 杭州 尔机械有限公司| 石家庄安瑞科气体机械有限公司| 江苏鸿泰钢铁有限公司| 深圳塑胶机械有限公司| 安徽康乐机械有限公司| 徐州丰展机械有限公司| 物理农林机械有限公司| 江西江锻重工有限公司| 上海起重设备有限公司| 江阴铸造机械有限公司| 河钢钢铁贸易有限公司| 云南科玛机械设备有限公司| 青州市远航机械设备有限公司 | 洛阳美卓重工机械有限公司| 浙江勇力机械有限公司| 泰安正阳机械有限公司| 攀枝花钢铁有限公司| 重庆中容石化机械制造有限公司| 经纬纺织机械有限公司| 华力重工机械有限公司| 杭州九钻机械有限公司| 河南茂盛机械制造有限公司| 南通腾中机械有限公司| 济南焊达机械有限公司| 哈尔滨工程机械有限公司| 盐城丰炜机械制造有限公司| 青岛华雷重工设备有限公司| 石家庄聚力特机械有限公司| 台州市双辉机械设备有限公司 | 浙江海蜜机械有限公司| 河南龙工机械制造有限公司| 常德三一机械有限公司| 三门峡化工机械有限公司| 柳州工程机械有限公司| 富华重工有限公司老板| 大连龙尧塑料机械有限公司| 浙江海蜜机械有限公司| 宝鸡 机械有限公司| 鼎泰盛机械有限公司| 山东首钢钢铁贸易有限公司| 扬州福尔喜果蔬汁机械有限公司| 厦门机械制造有限公司| 苏州锐豪机械制造有限公司| 浙江精劲机械有限公司| 河北东方富达机械有限公司 | 玉环方博机械有限公司| 新乐华宝塑料机械有限公司| 环保设备机械有限公司| 上海永策机械设备有限公司| 武汉联明机械有限公司| 东莞信易电热机械有限公司| 重庆江峰机械有限公司| 昆山锦沪机械有限公司| 杭州天扬机械有限公司| 迁安荣信钢铁有限公司| 浙江晟达机械有限公司| 河北敬业钢铁有限公司| 广东粤东机械实业有限公司| 宁波奥晟机械有限公司| 玉环博机械有限公司| 山东同洲机械制造有限公司| 浙江环兴机械有限公司| 上海鹏则机械有限公司| 重庆维庆液压机械有限公司| 浙江欣炜机械有限公司| 浙江德孚机械有限公司| 营口京华钢铁有限公司招聘| 邢台 机械有限公司| 德清章盟机械设备有限公司| 宁波博信机械制造有限公司| 浙江纺织机械有限公司| 合肥金锡机械有限公司| 青岛欧普机械设备有限公司| 台进精密机械有限公司| 重庆双腾机械制造有限公司| 北京航天振邦精密机械有限公司| 上海 包装机械 有限公司| 江阴祥乐机械有限公司| 上海机械成套设备有限公司| 上海光华印刷机械有限公司| 丹阳荣嘉精密机械有限公司 | 山东泰山起重机械有限公司| 长沙益广制药机械有限公司| 海华机械制造有限公司| 国浩机械制造有限公司| 长兴军毅机械有限公司| 泉州泉盛机械有限公司| 杭州武林机械有限公司| 泰钢钢铁贸易有限公司| 广东思沃精密机械有限公司| 景德镇 机械有限公司| 上海佳成服装机械有限公司| 上海光塑机械制造有限公司| 福建省晋江市和盛机械有限公司 | 济南建设机械有限公司| 洛阳奥图机械设备有限公司| 济南包装机械有限公司| 河南三兄重工有限公司| 瑞安 机械有限公司| 福建巨霸机械有限公司| 深圳市 机械有限公司| 无锡布勒机械有限公司| 广州山推机械有限公司| 浙江凯岛起重机械有限公司| 沈阳斗山工程机械有限公司| 溧阳申特钢铁有限公司| 广州市日富包装机械有限公司| 青岛包装机械有限公司| 青岛大牧人机械有限公司| 昆山市烽禾升精密机械有限公司| 河北 机械 有限公司| 湖南力诺机械有限公司| 上海春日机械工业有限公司| 中山弘立机械有限公司| 无锡机械制造有限公司| 东莞市乔锋机械有限公司| 福建泉成机械有限公司| 无锡联通焊接机械有限公司| 上海板换机械设备有限公司| 苏州松发机械有限公司| 上海传动机械有限公司| 山东宇冠机械有限公司| 天烨机械工程有限公司| 杭州五金机械有限公司| 杭州重型机械有限公司| 章丘明天机械有限公司| 河南钢铁贸易有限公司| 抚顺起亮食品有限公司| 中阳钢铁有限公司招聘| 辽宁 机械制造有限公司| 合肥市春华起重机械有限公司| 东莞市永创包装机械有限公司| 起重机械制造有限公司| 常州 机械 有限公司| 泰安通远机械有限公司| 天津 机械制造有限公司| 青岛万邦包装机械有限公司| 江苏海豚船舶机械有限公司| 济南 机械有限公司| 鑫华机械制造有限公司| 江阴华东机械有限公司| 张家港亿塑机械有限公司| 溧阳市机械有限公司| 三星机械制造有限公司| 宁波达峰机械有限公司| 常州博成机械有限公司| 江苏柯恒石化电力机械有限公司| 湖州市湖州机械有限公司| 淄博捷达机械有限公司| 上海明硕机械有限公司| 东莞市途锐机械有限公司| 常州宏机械有限公司| 唐山国丰钢铁有限公司| 南昌中昊机械有限公司| 湖北三六重工有限公司| 重庆信鼎精密机械有限公司| 南京阿特拉斯机械设备有限公司 | 福建三宝钢铁有限公司| 宁波力劲机械有限公司| 大连龙尧塑料机械有限公司| 山东山推工程机械结构件有限公司| 山东诸城机械有限公司| 青岛北船重工有限公司| 优瑞纳斯液压机械有限公司| 天津市华天世纪机械有限公司| 杭州杭达机械有限公司| 东莞机械设备有限公司| 卓轮天津机械有限公司| 洛阳泰红农业机械有限公司| 昆山日日先精密机械有限公司| 泰州机械制造有限公司| 郑州液压机械有限公司| 上海兴享机械工业有限公司| 新乡市振英机械设备有限公司 | 雷州雷宝机械有限公司| 宁波天佳塑料机械有限公司| 山东亚泰重型机械有限公司| 无锡佳特机械有限公司| 尤工机械设备有限公司| 无锡传动机械有限公司| 河北安丰钢铁有限公司| 南通密炼捏合机械有限公司| 贵阳闽达钢铁有限公司| 贵阳长乐钢铁有限公司| 安来动力机械有限公司| 长沙昊博机械设备有限公司| 诸城市富瑞德机械有限公司 | 广州市广花包装机械有限公司| 昆山工业机械有限公司| 上海熊猫机械有限公司| 洛阳古城机械有限公司| 大连液力机械有限公司| 山东讴神机械制造有限公司| 温州市润新机械制造有限公司| 青岛海佳机械有限公司| 武汉格瑞拓机械有限公司| 济南四通机械有限公司| 龙口隆基机械有限公司| 皋兰兰鑫钢铁有限公司| 滕州三合机械有限公司| 淮安液压机械有限公司| 江南机械制造有限公司| 恒源机械制造有限公司| 青岛雷沃工程机械有限公司| 牛力机械制造有限公司| 金瑞机械制造有限公司| 大庆机械制造有限公司| 衡阳运输机械有限公司| 珠海机械设备有限公司| 天津市精密机械有限公司| 山东机械铸造有限公司| 河北水利机械有限公司| 中核华兴达丰工程机械有限公司 | 武汉中粮机械有限公司| 广州佳速精密机械有限公司| 宁波敏达机械有限公司| 青岛海佳机械有限公司| 杭州双利机械有限公司| 青岛精锐机械制造有限公司| 天津润机械有限公司| 嘉兴机械设备有限公司| 泰安华伟重工有限公司| 北京富佳伟业机械制造有限公司| 东莞市鸿铭机械有限公司| 大阳通用机械有限公司| 徐州永欣重工有限公司| 郑州鼎盛机械设备有限公司| 河北敬业钢铁有限公司| 浙江工程机械有限公司| 焦作泰鑫机械有限公司| 东莞市华森重工有限公司| 东莞市兆恒机械有限公司| 大连连美机械有限公司| 无锡双象橡塑机械有限公司| 河南机械制造有限公司| 新乡市金原起重机械有限公司| 福州协展机械有限公司| 沧州铁狮磨浆机械有限公司| 上海卓亚矿山机械有限公司| 山东 纺织机械 有限公司| 重庆精密机械有限公司| 东莞市欧西曼机械设备有限公司| 保定东利机械制造有限公司 | 深圳市 机械 有限公司| 广州泽比机械设备有限公司| 济宁通佳机械有限公司| 江西四通重工机械有限公司| 浙江三叶机械有限公司| 鑫磊机械制造有限公司| 精密机械设备有限公司| 青岛天乐机械有限公司| 诸城市日通机械有限公司| 广东中远海运重工有限公司| 泉州机械设备有限公司| 上海胜松机械制造有限公司| 兰州长征机械有限公司| 福建东亚机械有限公司| 大连精密机械有限公司| 济宁新田工程机械有限公司| 烟台鼎科机械有限公司| 浙江中力机械有限公司| 上海佳成服装机械有限公司 | 苏州科瑞机械有限公司| 广州中益机械有限公司| 洛阳中收机械装备有限公司招聘| 湖北川谷机械有限公司| 青岛塑料机械有限公司| 无锡 钢铁贸易有限公司| 烟台安信精密机械有限公司| 常州豪凯机械有限公司| 山东山建机械有限公司| 广州伟乐机械设备有限公司| 莱州三和机械有限公司| 鞍山机械设备有限公司| 张家港亿塑机械有限公司| 苏州金韦尔机械有限公司| 广东恒联食品机械有限公司售后| 广州市德晟机械有限公司| 福建群峰机械有限公司| 上海申虎包装机械设备有限公司 | 天津富启机械有限公司| 南通凯瑞德机械有限公司| 佛山市包装机械有限公司| 立信染整机械深圳有限公司 | 山东莱工机械制造有限公司| 重村钢模机械工业苏州有限公司| 江苏汉鼎机械有限公司| 珠海机械设备有限公司| 宜都大一重工有限公司| 上海市机械有限公司| 安徽泰源工程机械有限公司| 宁波博信机械制造有限公司| 珠海市中鑫隆机械化建设工程有限公司| 安阳锻压机械有限公司| 珠海仕高玛机械设备有限公司 | 郑州米格机械有限公司| 苏州在田机械有限公司| 上海捷如重工机电设备有限公司| 江苏沃元精密机械有限公司| 山东泰力起重设备有限公司| 大连仁海重工有限公司| 南通天成机械有限公司| 上海航发机械有限公司| 青岛华鑫克斯顿机械有限公司| 宁波凯特机械有限公司| 郑州长宏机械制造有限公司| 江苏拓威机械有限公司| 泰州市机械有限公司| 唐山新宝泰钢铁有限公司| 唐山市钢铁有限公司| 德州宝鼎液压机械有限公司| 太仓越华精密机械配件有限公司 | 济南帕特机械有限公司| 江门广力机械有限公司| 南京聚力化工机械有限公司| 重庆屯茂机械有限公司| 青岛德盛机械制造有限公司 | 淮安机械制造有限公司| 温州锐光机械有限公司| 张家港市机械制造有限公司| 宁波辉旺机械有限公司| 江阴市勤业化工机械有限公司| 世创机械制造有限公司| 深圳市力豪机械设备有限公司| 东莞包装机械有限公司| 济南梓鑫机械有限公司| 吉林鑫达钢铁有限公司| 中山艾能机械有限公司| 无锡东晨机械有限公司| 西安工程机械有限公司| 杭州春江制药机械有限公司| 山东巨明机械有限公司| 亚泰重工机械有限公司| 石油机械设备有限公司| 精密达机械有限公司| 上海松仕机械设备有限公司| 安徽食品机械有限公司| 洛阳鹏起实业有限公司| 杭州海铭钢铁有限公司| 重型工程机械有限公司| 常州福牛机械有限公司| 咸阳经纬纺织机械有限公司| 天津机械配件有限公司| 定州宏远机械有限公司| 广州领新机械实业有限公司| 福建新源重工有限公司| 青岛恒林机械有限公司| 深圳市鑫宏伟机械设备有限公司 | 深圳机械院建筑设计有限公司| 华东油压机械制造有限公司| 腾达机械设备有限公司| 昆山奥德机械有限公司| 林州中奥机械有限公司| 张家口机械有限公司| 浙江冠林机械有限公司| 山东中悦钢铁有限公司| 淮安机械制造有限公司| 浙江瑞志机械有限公司| 沈阳友维机械有限公司| 禹城通裕新能源机械铸造有限公司 | 龙工江西机械有限公司| 陕西金奇机械电器制造有限公司 | 上海鼎龙机械有限公司| 聊城日发纺织机械有限公司| 鼎泰盛机械有限公司| 昆山市贝纳特机械设备有限公司| 玉环中本机械有限公司| 广西千里通机械设备有限公司| 建筑装饰有限公司起名| 天津宏大纺织机械有限公司| 莱州日进机械有限公司| 上海力净洗涤机械制造有限公司| 上海隆麦机械有限公司| 哈尔滨机械制造有限公司| 河南新起点印务有限公司| 京西重工北京有限公司| 无锡创能机械制造有限公司| 东莞市泽冠机械有限公司| 河南豫工机械有限公司| 西安北村精密机械有限公司| 苏州原禄机械有限公司| 东莞市顺翼机械有限公司| 冶金机械制造有限公司| 台州特特机械有限公司| 青岛机械制造有限公司| 江阴精力机械有限公司| 东莞市岛精机械有限公司 | 东方传动机械有限公司| 大连意美机械有限公司| 河南省力神机械有限公司| 晋江市机械有限公司| 太仓精密机械有限公司| 山西建龙钢铁有限公司| 广州市力进食品机械有限公司| 郑州矿山机械有限公司| 科瑞森机械有限公司| 宁波佳利来机械制造有限公司 | 德马格起重机械有限公司| 南通航力重工机械有限公司 | 浙江天鸿传动机械有限公司| 江苏竣业过程机械设备有限公司 | 安来动力机械有限公司| 江阴新迪机械有限公司| 开封良益机械有限公司| 慈溪市机械有限公司| 盐城 机械有限公司| 金瑞机械制造有限公司| 苏州施米特机械有限公司| 涿州北方重工设备设计有限公司| 上海京悦机械有限公司| 澳太机械制造有限公司| 无锡美高帝机械有限公司| 江苏力威机械有限公司| 青岛鲁耕农业机械有限公司| 河南豫弘重型机械有限公司| 福建申达钢铁有限公司| 河北钢铁矿业有限公司| 斗山工程机械苏州有限公司| 潍坊华全动力机械有限公司| 杭州联德机械有限公司| 康纳机械制造有限公司| 江阴精力机械有限公司| 临工金利机械有限公司| 京西重工上海有限公司| 中船重工重庆液压机电有限公司| 浙江卓驰机械有限公司| 蓬莱大金海洋重工有限公司| 集瑞联合重工有限公司| 青岛 钢铁有限公司| 上海 机械制造有限公司| 西安 机械有限公司| 上海德耐尔压缩机械有限公司| 东莞市森人机械有限公司| 长沙聚邦机械设备有限公司| 河南共威机械设备有限公司| 上海昊农农业机械有限公司| 昆山乙盛机械工业有限公司电话| 浙江春江茶叶机械有限公司| 上海美捷伦包装机械有限公司 | 沧州华众煤矿机械有限公司| 河北东方德源机械制造有限公司 | 全椒 机械有限公司| 上海包装机械设备有限公司| 中施机械设备有限公司| 盘起工业大连有限公司| 苏州奥天诚机械有限公司| 深圳创能机械有限公司| 泰安恒大机械有限公司| 宁波创基机械有限公司| 聊城机械设备有限公司| 昆山机械制造有限公司| 苏州华尔普机械有限公司| 东莞市业佳精密机械有限公司| 东莞市泽冠机械有限公司| 南通龙威机械有限公司| 山东联邦重工有限公司| 山东诸城机械有限公司| 济宁 机械有限公司| 南通路捷机械有限公司| 财益机械工业有限公司| 江苏大明重工有限公司| 昆山塑料机械有限公司| 上海 起重设备有限公司| 河南省邦恩机械制造有限公司| 唐河大华机械有限公司| 深圳华盛昌机械实业有限公司| 山东源泉机械有限公司| 镇江机械制造有限公司| 上海昊宇机械有限公司| 重庆培柴机械制造有限公司| 诸城市博康机械有限公司| 上海北阅机械设备有限公司| 东莞市自动化机械有限公司| 上海磊友成套机械设备有限公司 | 渭南金狮机械有限公司| 高峰机械工业有限公司| 江阴博丰钢铁有限公司| 抚顺机械设备制造有限公司| 河北中伟机械有限公司| 无锡森本精密机械有限公司| 天门仙粮机械有限公司| 新疆机械设备有限公司| 佛山市信虹精密机械有限公司| 山东河山机械有限公司| 昆山乙盛机械工业有限公司| 济南迅捷机械设备有限公司| 东莞凯格精密机械有限公司| 广州永胜钢铁制品有限公司| 欧力特机械有限公司| 浙江濠泰机械有限公司| 华天机械制造有限公司| 东莞市锋机械有限公司| 杭州容瑞机械技术有限公司| 信达重工苏州有限公司| 张家港机械设备有限公司| 鼎泰盛机械有限公司| 临海正大机械有限公司| 深圳电子机械有限公司| 杭州纳源传动机械有限公司| 深圳市合发齿轮机械有限公司| 兴龙机械模具有限公司| 济南科华机械有限公司| 江苏柳工机械有限公司| 上海得力起重索具有限公司| 济宁市福瑞得机械有限公司| 金沙机械制造有限公司| 宁波雄腾机械有限公司| 河南起重设备有限公司| 深圳市德润机械有限公司| 中信重工开诚智能装备有限公司| 青岛皓腾机械制造有限公司| 湖南申德钢铁有限公司| 莱州市龙骏化工机械有限公司| 青岛美克精密机械有限公司| 广东中远海运重工有限公司| 中阳钢铁有限公司电话| 东莞机械设备有限公司| 济南弘川包装机械有限公司| 浙江欧迈特减速机械有限公司| 东莞机械设备制造有限公司| 杭州双龙机械有限公司| 北京道森起点信息技术有限公司| 杭州海特机械有限公司| 博阳机械制造有限公司| 东莞市和明机械有限公司| 莱州化工机械有限公司| 山东元裕机械有限公司| 芜湖机械制造有限公司| 杭州旭众机械设备有限公司| 青岛诺机械有限公司| 东莞宝科机械有限公司| 合肥精密机械有限公司| 沧州科信环保机械有限公司| 溧阳申特钢铁有限公司| 四川久进机械制造有限公司| 丹阳荣嘉精密机械有限公司 | 溧阳申特钢铁有限公司|