sql - سكلديبندنسي لا يطلقون النار




asp.net webforms sqldependency (2)

كنت في عداد المفقودين: dependency.OnChange += new OnChangeEventHandler(OnChange); سيبدو الرمز الجديد كما يلي:

               SqlDependency dependency = new SqlDependency(command);

               dependency.OnChange += new OnChangeEventHandler(OnChange);

الآن أستطيع أن النار void OnChange(object sender, SqlNotificationEventArgs e)

أنا أحاول سكلديبيندينسي للمرة الأولى. أنا لا تحصل على أي إخطارات على تحديث قاعدة البيانات.

أنا وضع نقاط التوقف داخل: OnChange(object sender, SqlNotificationEventArgs e) ،

ولكن لم يحصل ضرب.

في ما يلي الشفرة:

    protected void Page_Load(object sender, EventArgs e)
    {

        Label1.Text = "Cache Refresh: " + DateTime.Now.ToLongTimeString();
        DateTime.Now.ToLongTimeString();
        // Create a dependency connection to the database.
        SqlDependency.Start(GetConnectionString());

        using (SqlConnection connection = new SqlConnection(GetConnectionString()))
        {
            using (SqlCommand command = new SqlCommand(GetSQL(), connection))
            {

                SqlDependency dependency =
                        new SqlDependency(command);

                    // Refresh the cache after the number of minutes
                    // listed below if a change does not occur.
                    // This value could be stored in a configuration file.
                                  connection.Open();

                dgHomeRequests.DataSource = command.ExecuteReader();
                    dgHomeRequests.DataBind();

            }
        }   
    }


    private string GetConnectionString()
    {
        // To avoid storing the connection string in your code,
        // you can retrieve it from a configuration file.
        //return "Data Source=(local);Integrated Security=true;" +"Initial Catalog=AdventureWorks;";
        return ConfigurationManager.ConnectionStrings["TestData"].ConnectionString;
    }
    private string GetSQL()
    {
        return "Select [Address] From [UserAccount1]";
    }


    void OnChange(object sender, SqlNotificationEventArgs e)
    {
        // have breakpoint here:
        SqlDependency dependency = sender as SqlDependency;

        // Notices are only a one shot deal
        // so remove the existing one so a new 
        // one can be added

        dependency.OnChange -= OnChange;

        // Fire the event
       /* if (OnNewMessage != null)
        {
            OnNewMessage();
        }*/
    }

لقد وضعت أيضا بعض التعليمات البرمجية في ملف Global.asax:

public class Global : HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        // Code that runs on application startup
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        SqlDependency.Start(ConfigurationManager.ConnectionStrings["TestData"].ConnectionString);
    }
    protected void Application_End()
    {
        // Shut down SignalR Dependencies
        SqlDependency.Stop(ConfigurationManager.ConnectionStrings["TestData"].ConnectionString);
    }
}

خادم سكل على الجهاز المحلي. أنا تشغيل التعليمات البرمجية من خلال فيسوال ستوديو (إيس إكسبريس).

  1. لتمكين وسيط الخدمة على قاعدة البيانات:

    ألتر داتاباس سيت ENABLE_BROKER غو

  2. للاشتراك في إشعار الاستعلام، نحتاج إلى منح الإذن لحساب خدمة إيس

    GRANT SUBSCRIBE QUERY NOTIFICATIONS TO “<serviceAccount>”

اعتقدت ليست هناك حاجة نقطة 2ND كما هو المحلي. ولكن حاولت إعطائها بعض الأذونات. لا أعرف ما إذا كانوا على حق كما لا أعتقد أنه يستخدم تجمع app.And لا تحتاج إلى إذن على إنف المحلية. إذا أنا المستخدم نفسي وأنشأت المخطط نفسي.

وكانت إحدى الأسئلة التي رأيتها هي:

alter authorization on database::<dbName> to [sa];

أعطيت هذا الإذن أيضا.


بعد مراجعة هذا العام بعد ذلك ، اكتشفت بعض المعلومات الإضافية حول مشاركتي الأصلية حول "إسقاط" ذاكرة التخزين المؤقت بشكل عشوائي. ينص MSDN التالية للحصول على خصائص ذاكرة التخزين المؤقت للتكوين CacheMemoryLimitMegabytes و PhysicalMemoryLimitPercentage :

القيمة الافتراضية هي 0 ، مما يعني أن الأساليب البحثية التلقائية لطبقة الذاكرة MemoryCache تُستخدم افتراضيًا.

إجراء بعض التفكيك والتحقيق ، هناك سيناريوهات محددة سلفا في عمق فئة CacheMemoryMonitor.cs التي تحدد عتبات الذاكرة. هذه عينة من التعليقات في هذه الفئة على الخاصية AutoPrivateBytesLimit :

// Auto-generate the private bytes limit:
// - On 64bit, the auto value is MIN(60% physical_ram, 1 TB)
// - On x86, for 2GB, the auto value is MIN(60% physical_ram, 800 MB)
// - On x86, for 3GB, the auto value is MIN(60% physical_ram, 1800 MB)
//
// - If it's not a hosted environment (e.g. console app), the 60% in the above
//   formulas will become 100% because in un-hosted environment we don't launch
//   other processes such as compiler, etc.

ليس بالضرورة أن تكون القيم المحددة مهمة بقدر ما تدرك لماذا يتم استخدام ذاكرة التخزين المؤقت غالبًا: لتخزين كائنات كبيرة لا نريد جلبها مرارًا وتكرارًا. إذا تم تخزين هذه الكائنات الكبيرة في ذاكرة التخزين المؤقت وتم تجاوز عتبة ذاكرة البيئات المضيفة بناءً على هذه الحسابات الداخلية ، فقد تتم إزالة العنصر من ذاكرة التخزين المؤقت تلقائيًا . هذا يمكن أن يفسر بالتأكيد سياسة العمليات الخاصة بي لأنني كنت تخزين مجموعة كبيرة جدا في الذاكرة على خادم مستضاف مع ربما 2GB من الذاكرة تشغيل تطبيقات متعددة في IIS.

هناك تجاوز واضح لإعداد هذه القيم. يمكنك من خلال التكوين (أو عند إعداد مثيل MemoryCache ) ضبط قيم CacheMemoryLimitMegabytes و PhysicalMemoryLimitPercentage . فيما يلي عينة معدلة من رابط MSDN التالي حيث أقوم بتعيين physicalMemoryPercentage إلى 95 (٪):

<configuration>
  <system.runtime.caching>
    <memoryCache>
      <namedCaches>
          <add name="default" 
               physicalMemoryPercentage="95" />
      </namedCaches>
    </memoryCache>
  </system.runtime.caching>
</configuration>




sql asp.net webforms sqldependency