كيف يمكنك تحديد ما إذا تم استرداد اتصال JDBC من تمكين مصدر البيانات JTA أو JDBC على التوالي؟

StackOverflow https://stackoverflow.com/questions/180713

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا باستخدام API بائع للحصول على اتصال JDBC إلى قاعدة بيانات التطبيق. يعمل API عند التشغيل في تطبيق الخادم أو عند التشغيل في وضع مستقل. أريد أن تشغيل سلسلة من البيانات SQL في عملية واحدة. انا بخير معهم تحدث في سياق المعاملة JTA إذا كان موجودا. ومع ذلك، إذا لم يكن ثم أنا بحاجة إلى استخدام أساليب ترسيم الصفقة JDBC. (دعوة هذه الأساليب على اتصال JDBC أن تشارك في معاملة JTA يسبب SQLException).

ولذا أنا بحاجة لتكون قادرة على تحديد ما إذا كان اتصال جاء من JTA تمكين مصدر البيانات أو لو كان مجرد اتصال JDBC على التوالي.

هل هناك طريقة مستقيمة لجعل هذا القرار؟

وشكرا!

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

المحلول

وحتى لو كان JDBC على التوالي، هل يمكن أن يكون صفقة JTA تمكين. سوف تحقق العلم AUTOCOMMIT NOT مساعدة في هذا الصدد. يمكنك أن تكون في معاملة موزعة أو غير ذلك، مع AUTOCOMMIT إلى false. تعيين AUTOCOMMIT إلى true أن أقول لك أنك لست في معاملة موزعة لكن قيمة false يعني فقط أنك لن صناعة السيارات في ارتكاب ... يمكن أن يكون في أي نوع من الصفقة.

وأعتقد أنك ستكون لدينا للاتصال UserTransaction.getStatus () والتحقق من أنها لا تساوي Status.NoTransaction (). هذا من شأنه أن أقول لك إذا كنت في معاملة JTA.

نصائح أخرى

وماذا يقول تيلو لا معنى له.

وبخلاف ذلك، لم تكن متأكدا من طريقة مستقيمة ولكن سأقدم لك طريقة "الإختراق"

وإرسال SQL الكريهة التي تعرف سيعطي استثناء DB. وهذا يؤدي إلى تتبع المكدس. من تتبع المكدس، يمكنك معرفة ما اذا كان هو JTA المستمدة اتصال أو لا؟

<الإضراب> هل يمكن في محاولة للتحقق العلم AUTOCOMMIT اتصال لمعرفة ما إذا كان في معاملة (بغض النظر عن من أين جاء). (على ما يبدو، وانظر جواب المقبولة، هذا لا يعمل بشكل جيد جدا وأنا لا حذف هذه الإجابة ليلي لا يزال قائما:)

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

تحديث: مجرد إعادة قراءة سؤالك ورأى أنه لم يتم توفير API، لكنهم يريدون استخدام اتصال الحاويات التي تديرها. ولكن لا يزال، يمكنك فقط ولاية (كجزء من متطلبات التطبيق الخاص بك) أن JTA تكون سارية المفعول؟ إذا لم يكن كذلك، هل يمكن أن توفير خيار التكوين لتعود مرة أخرى إلى المعاملات تدار يدويا. لمثل هذه الميزة الهامة فإنه يبدو من المعقول أن يطلب من التكوين الصحيح (على العكس من محاولة تخمين ما سيكون مناسبا).

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