سؤال

أنا لم تكن مألوفة جدا مع قواعد البيانات و ما تقدمه خارج عمليات الخام.

بحثي قادني إلى المشغلات.في الأساس يبدو أن يتسبب في تقدم هذا النوع من الوظائف:

(من ويكيبيديا)

هناك عادة ثلاثة اثار الأحداث التي تسبب يطلق على "النار":

  • إدراج الحدث (كما سجل جديد يتم إدراجها في قاعدة البيانات).
  • تحديث الحدث (كما سجل تغير).
  • حذف الحدث (كما سجل يتم حذفها).

سؤالي هو:هل هناك طريقة أستطيع أن يخطر في جافا (ويفضل بما في ذلك البيانات التي تم تغييرها) من قاعدة البيانات عندما سجل تحديث/حذف/إدراجها باستخدام نوع من الزناد دلالات الألفاظ ؟

ما قد يكون بعض الحلول البديلة لهذه المشكلة ؟ كيف يمكنني الاستماع إلى قاعدة بيانات الأحداث ؟

السبب الرئيسي أريد أن أفعل هذا سيناريو مثل هذا:

لدي 5 تطبيقات العميل كافة في مختلف العمليات/القائمة عبر أجهزة الكمبيوتر المختلفة.فإنها جميعا تشترك في نفس قاعدة البيانات (بوستجرس في هذه الحالة).

يتيح القول عميل واحد التغييرات سجل في DB أن كل 5 من عملاء "مهتمة".أنا أحاول التفكير في طرق للعملاء أن يكون "أخطر" من التغيير (ويفضل مع المتضررين البيانات المرفقة) بدلا من الاستعلام عن البيانات في بعض الفاصل.

هل كانت مفيدة؟

المحلول

باستخدام Oracle، يمكنك إعداد مشغل على جدول ومن ثم جعل المشغل يرسل رسالة JMS.لدى Oracle تطبيقان مختلفان لـ JMS.يمكنك بعد ذلك إجراء عملية "الاستماع" للرسالة باستخدام برنامج تشغيل JDBC.لقد استخدمت هذه الطريقة لدفع التغييرات إلى تطبيقي مقابل تطبيقي.الاقتراع.إذا كنت تستخدم قاعدة بيانات Java (H2)، فلديك خيارات إضافية.في تطبيقي الحالي (SIEM) لدي مشغلات في H2 تنشر أحداث التغيير باستخدام JMX.

نصائح أخرى

لا تخلط بين قاعدة البيانات (التي تحتوي على البيانات) والأحداث الموجودة على تلك البيانات.

تعد المشغلات إحدى الطرق، ولكن عادةً ما يكون لديك طبقة ثبات في تطبيقك.يمكن لهذه الطبقة أن تختار إطلاق الأحداث عند حدوث أشياء معينة - على سبيل المثال لموضوع JMS.

تعد المشغلات بمثابة الخندق الأخير، حيث أنك تعمل على العناصر العلائقية بعد ذلك، بدلاً من "الأحداث" على البيانات.(على سبيل المثال، "التحديث"، يمكن في الواقع تعيينه إلى حدث "تغيير الاسم القانوني للشركة") إذا كنت تعتمد على قاعدة البيانات، فسيتعين عليك تعيين الإدخالات والتحديثات مرة أخرى إلى أحداث الحياة الحقيقية....الذي كنت تعرفه بالفعل!

يمكنك بعد ذلك إضافة أشياء أخرى فوق هذه الإشعارات - مثل معالجة تدفق الأحداث - للعثور على الأحداث التي تهم الآخرين.

جوامع

همم.إذن أنت تستخدم PostgreSQL وتريد "الاستماع" للأحداث و"إعلامك" عند حدوثها؟

http://www.postgresql.org/docs/8.3/static/sql-listen.html http://www.postgresql.org/docs/8.3/static/sql-notify.html

أتمنى أن يساعدك هذا!

واصفا العمليات الخارجية من قاعدة البيانات هو بائع محددة.

قبالة الجزء العلوي من رأسي:

  • SQLServer يمكن استدعاء CLR البرامج من المشغلات ،

  • كيو يمكن أن نطلق التعسفي ج وظائف تحميلها بشكل حيوي ،

  • الخلية يمكن أن نطلق التعسفي C الوظائف ، لكن لا بد من جمعها ،

  • Sybase يمكن أن تجعل النظام المكالمات إذا وضع حتى أن تفعل ذلك.

إن أبسط ما يمكنك فعله هو جعل مشغلات الإدراج/التحديث/الحذف تقوم بإدخال إدخال في بعض جداول السجل، وجعل برنامج جافا الخاص بك يراقب هذا الجدول.الأعمدة الجيدة التي يجب أن تكون موجودة في جدول السجل الخاص بك هي أشياء مثل EVENT_CODE، وLOG_DATETIME، وLOG_MSG.

إلا إذا كنت تحتاج إلى أداء عالٍ جدًا أو تحتاج إلى التعامل مع 100 ألف من السجلات، فمن المحتمل أن يكون هذا كافيًا.

أعتقد أنك تخلط بين شيئين.كلاهما خاصان ببائعي قاعدة بيانات عالية.

الأول سأسميه "المشغلات".أنا متأكد من أن هناك بائع قاعدة بيانات واحدًا على الأقل يعتقد أن المشغلات مختلفة عن هذه، لكن تحملني.المشغل عبارة عن جزء من التعليمات البرمجية من جانب الخادم يمكن إرفاقه بالجدول.على سبيل المثال، يمكنك تشغيل إجراء PSQL المخزن في كل تحديث في الجدول X.تسمح لك بعض قواعد البيانات بكتابة هذه اللغات بلغات برمجة حقيقية، والبعض الآخر يسمح لك بكتابة هذه اللغات بلغات برمجة حقيقية فقط.عادةً ما تكون المشغلات سريعة وقابلة للتطوير بشكل معقول.

والآخر سأسميه "الأحداث".هذه هي المشغلات التي يتم إطلاقها في قاعدة البيانات والتي تسمح لك بتحديد معالج الأحداث في برنامج العميل الخاص بك.IE، في أي وقت توجد تحديثات لقاعدة بيانات العملاء، قم بتشغيل UpdateClientsList في برنامجك.على سبيل المثال، باستخدام بايثون وفايربيرد نرى http://www.firebirdsql.org/devel/python/docs/3.3.0/beyond-python-db-api.html#database-event-notification

أعتقد أن الاقتراح السابق لاستخدام الشاشة هو طريقة مكافئة لتنفيذ ذلك باستخدام قاعدة بيانات أخرى.ربما أوراكل؟خدمات إعلام MSSQL المذكورة في إجابة أخرى هي تطبيق آخر لهذا أيضًا.

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

ما تطلبه يعتمد بشكل كامل على قاعدة البيانات التي تستخدمها وإطار العمل الذي تستخدمه للتواصل مع قاعدة البيانات الخاصة بك.

إذا كنت تستخدم شيئًا مثل Hibernate كطبقة استمرارية، فهو يحتوي على مجموعة من المستمعين والمعترضين الذين يمكنك استخدامها لمراقبة السجلات التي تدخل وتخرج من قاعدة البيانات.

هناك بعض التقنيات المختلفة هنا اعتمادًا على قاعدة البيانات التي تستخدمها.إحدى الأفكار هي استطلاع قاعدة البيانات (وأنا متأكد من أنك تحاول تجنبها).في الأساس، يمكنك التحقق من التغييرات بين الحين والآخر.

هناك حل آخر (إذا كنت تستخدم SQL Server 2005) وهو استخدام خدمات الإشعارات، على الرغم من أنه من المفترض أن يتم استبدال هذه التقنية في SQL 2008 (لم نر بديلاً خالصًا بعد، لكن Microsoft تحدثت عنها علنًا).

إذا كنت تستخدم أوراكل، تحقق من هذا المنشور السابق.

هذا هو عادةً الغرض من تطبيق العميل/الخادم القياسي.إذا مرت جميع عمليات الإدراج/التحديثات/الحذف عبر تطبيق الخادم، الذي يقوم بعد ذلك بتعديل قاعدة البيانات، فيمكن لتطبيقات العميل معرفة التغييرات التي تم إجراؤها بسهولة أكبر.

إذا كنت تستخدم postgresql، فلديه القدرة على الاستماع إشعارات من عميل JDBC.

أود أن أقترح استخدام عمود الطابع الزمني، آخر تحديث، مع إمكانية قيام المستخدم بتحديث السجل، ثم السماح للعملاء بالتحقق من الطابع الزمني للسجل المحلي الخاص بهم مقابل السجل الثابت.

التعقيد الإضافي المتمثل في إضافة وظيفة رد الاتصال/التشغيل لا يستحق كل هذا العناء في رأيي، ما لم يتم دعمه من خلال الواجهة الخلفية لقاعدة البيانات ومكتبة العميل المستخدمة، مثل خدمات الإعلام المقدمة لـ SQL Server 2005 المستخدمة مع ADO.NET على سبيل المثال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top