كيفية إيقاف تشغيل قاعدة بيانات Derby في الذاكرة بشكل صحيح

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

سؤال

أنا أستخدم Derby كقاعدة بيانات مضمنة. علاوة على ذلك ، أنا أستخدم خيار قاعدة البيانات في الذاكرة لاختبارات وحدتي.

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

سأغفل التفاصيل ، سأضيفها إذا كانت هناك حاجة إلى شعور آخر.

في الأساس ، أحاول إيقاف قاعدة البيانات الخاصة بي في هاتين الموضات حيث تسمى قاعدة بيانات الذاكرة الخاصة بي باستمرار "EH":

DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");

من ثم:

DriverManager.getConnection("jdbc:derby:eh;shutdown=true");

السابق ينتج عنه استثناء ولكن ليس الشخص المتوقع. التفاصيل هي:

java.sql.sqlnontransientConnectionException: قاعدة البيانات 'الذاكرة: eh' إيقاف التشغيل.

هذا الأخير ينتج عنه

java.sql.sqlexception: قاعدة البيانات 'eh' لم يتم العثور عليها.

بناءً على ما تمكنت من اكتشافه ، نريد أ SQLException ولكن ليس الشخص الذي نتلقاه. من ناحية أخرى ، SQLNonTransientConnectionException يبدو الخطأ أكثر ملاءمة ولكن ليس هو النوع الصحيح (على الرغم من أنه مشتق منه SQLException) ولا لديها رمز الحالة الصحيح. ينتهي رمز الدولة في نهاية المطاف: 08006.

رمز المثال لدي يوضح أن أ SQLException مع حالة SQL من "XJ015".

ملاحظة: المثال الذي أشير إليه هو: برنامج wwdembedded (كود جافا).

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

المحلول

XJ015 (مع SQLCODE 50000) هو المتوقع (ناجح) SQLSTATE لإغلاق النظام الكامل. 08006 (مع SQLCODE 45000) ، من ناحية أخرى ، هو المتوقع SQLSTATE لإغلاق قاعدة بيانات فردية فقط.

DriverManager.getConnection("jdbc:derby:;shutdown=true");

يغلق النظام بأكمله ويجب أن يؤدي إلى XJ015.

نصائح أخرى

عنوان URL "jdbc: derby: الذاكرة: eh ؛ sthown = true" ينتج عن رمز الخطأ 08006 المتوقع ، ولكنه لا يزيل DB بالفعل من الذاكرة. إذا حاولت لاحقًا إنشاء قاعدة بيانات جديدة مع "JDBC: Derby: Memory: EH ؛ Create = True" ، ستحصل على خطأ يقول أن قاعدة البيانات موجودة بالفعل.

لحسن الحظ ، اعتبارًا من Derby 10.6.1.0 (تم إصداره في 17 مايو 2010) ، من الممكن بالفعل إسقاط قاعدة بيانات في الذاكرة باستخدام عنوان URL للنموذج "JDBC: Derby: Memory: EH ؛ Drop = True". انظر ملاحظات الإصدار والصفحة باستخدام قواعد البيانات في الذاكرة.

أعتقد أن مثال الرمز الأول الخاص بك على ما يرام. أعتقد أن اختلاف حالة SQL الذي تراه ، لأنك تقوم بتشغيل Derby مضمونة ، ولكن رمز المثال الذي رأيته (مع SQL State XJ015) كان يعمل في تكوين خادم العميل.

كما لاحظت ، فإن sqlnontransientConnectionException هي فئة فرعية من sqlexception ، لذلك أنا في حيرة من أمرك بشأن سبب اعتقادك أنك لا تحصل على النوع الصحيح من الاستثناء.

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