2013-05-05 19 views
13

मुझे एक तालिका के लिए SqlCacheDependency लागू करने की आवश्यकता है जो इस क्वेरी पर निर्भर करेगा: SELECT Nickname FROM dbo.[User]SqlCacheDependency का उपयोग कैसे करें?

मैं इस उद्देश्य के लिए एक विधि बनाया है:

private IEnumerable<string> GetNicknamesFromCache() 
    { 
     const String cacheValueName = "Nicknames"; 

     var result = HttpRuntime.Cache.Get(cacheValueName) as List<String>; 
     if (result == null) 
     { 
      result = _repository.GetAllNicknames(); 

      var connectionString = ConfigurationManager.ConnectionStrings["RepositoryContext"].ConnectionString; 
      var sqlConnection = new SqlConnection(connectionString); 
      var sqlCommand = new SqlCommand("SELECT Nickname FROM dbo.[User]", sqlConnection); 
      var sqlDependency = new SqlCacheDependency(sqlCommand); 

      HttpRuntime.Cache.Insert(cacheValueName, result, sqlDependency); 
     } 

     return result; 
    } 

लेकिन यह काम नहीं करता है जब मैं अपने आवेदन चलाते हैं। मैंने ग्राहकों की सूची (sys.dm_qn_subscriptions तालिका) की जांच की और कोई रिकॉर्ड नहीं था।

मैं ज्यादा समय की जांच की और पहले से ही विभिन्न समाधान की कोशिश की है, लेकिन वे मेरे लिए काम नहीं करता:

  • उपयोग विश्वसनीय कनेक्शन और सार्वजनिक भूमिका के लिए कुछ अनुमति सेट:

    GRANT CREATE PROCEDURE TO public
    GRANT CREATE QUEUE TO public
    GRANT CREATE SERVICE TO public
    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO public
    GRANT SELECT ON OBJECT::dbo.[User] TO public
    GRANT RECEIVE ON QueryNotificationErrorsQueue TO public

  • उपयोग 'सा' कनेक्शन के लिए लॉगिन

  • उपयोग aspnet_regsql.exe (aspnet_regsql.exe -S localhost -E -ed -d TestTable -et -t User)
  • web.config में system.webServer के विन्यास जोड़ें:

    <caching>
    <sqlCacheDependency enabled="true">
    <databases>
    <add name="Tmpl" pollTime="5000" connectionStringName="RepositoryContext"/>
    </databases>
    </sqlCacheDependency>
    </caching>

  • एसक्यूएल सर्वर (SQL सर्वर 2008 एक्सप्रेस, एसक्यूएल के विभिन्न उदाहरणों पर

  • रन Global.asax Application_Start घटना में SqlDependency.Start() डाल सर्वर 2008)

लेकिन इससे मदद नहीं मिली। यह अभी भी काम नहीं करता है।

मैं इसे कैसे काम करूं?

उत्तर

18

मुझे पहले से ही समाधान मिल गया है।

पहली जांच में

सेवा ब्रोकर अपनी मेज के लिए सक्षम है कि क्या है और यह सक्षम अगर जरूरत: यह करने के लिए

SELECT name, is_broker_enabled FROM sys.databases WHERE name = '<databaseName>' 

ALTER DATABASE <databaseName> SET enable_broker WITH ROLLBACK IMMEDIATE 

अगला एसक्यूएल सर्वर नई भूमिका sql_dependency_role में बनाने के लिए, प्रदान करने की अनुमतियों और उपयोगकर्ता के लिए भूमिका अनुदान:

EXEC sp_addrole 'sql_dependency_role' 

GRANT CREATE PROCEDURE to sql_dependency_role 
GRANT CREATE QUEUE to sql_dependency_role 
GRANT CREATE SERVICE to sql_dependency_role 
GRANT REFERENCES on CONTRACT::[http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification] to sql_dependency_role 
GRANT VIEW DEFINITION TO sql_dependency_role 
GRANT SELECT to sql_dependency_role 
GRANT SUBSCRIBE QUERY NOTIFICATIONS TO sql_dependency_role 
GRANT RECEIVE ON QueryNotificationErrorsQueue TO sql_dependency_role 

EXEC sp_addrolemember 'sql_dependency_role', '<userName>' 

उसके बाद SqlCacheDependency या SqlDependency (अधिकतर वैसे ही) के साथ काम करने के लिए सी # कोड जोड़ें।

मैं अपने विधि को बदल दिया है और अब यह इस तरह दिखता है:

private IEnumerable<string> GetNicknamesFromCache() 
    { 
     const String cacheValueName = "Nicknames"; 

     var result = HttpRuntime.Cache.Get(cacheValueName) as List<String>; 
     if (result == null) 
     { 
      result = _repository.GetAllNicknames(); 

      using (var connection = new SqlConnection(_config.ConnectionString)) 
      { 
       connection.Open(); 

       SqlDependency.Start(_config.ConnectionString); 
       var command = new SqlCommand("SELECT Nickname FROM dbo.[User]", connection); 
       var dependency = new SqlCacheDependency(command); 
       HttpRuntime.Cache.Insert(cacheValueName, result, dependency); 

       command.ExecuteNonQuery(); 
      } 
     } 

     return result; 
    } 

अब यह ठीक काम करता है।

SqlCacheDependency या SqlDependency बनाने से पहले SqlDependency.Start विधि को न भूलें और अंत में अपना आदेश निष्पादित करें।

+0

क्या आपने कनेक्शन को खोलना जरूरी है जैसा आपने यहां किया है या क्या आप इसे बंद/निपटान कर सकते हैं? –

+0

उपरोक्त मेरे अपने प्रश्न का उत्तर देना - यह कनेक्शन खोलना जरूरी है ताकि सेवा दलाल उन सूचनाओं को भेज सके। जो आपके आस-पास डिज़ाइन करने में थोड़ा कठिन बनाता है यदि आपके पास कई कैश प्रविष्टियां हैं जिन्हें रीफ्रेश करने की आवश्यकता है। –

संबंधित मुद्दे