كيفية الحصول على أكثر من 1000 عنصر في HSQLDB في حالة البيان؟

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

  •  22-07-2019
  •  | 
  •  

سؤال

أقوم بتشغيل الاستعلام التالي في DB hypersonic (HSQLDB):

SELECT (CASE foo WHEN 'a' THEN 'bar' WHEN 'b' THEN 'biz' ....
        ELSE 'fin' END ) FROM MyTable LIMIT 1

عندما يتجاوز عدد الجمل "عندما" حوالي 1000 ، أحصل على جافا StackOverflowError ألقاه سائق JDBC في org.hsqldb.jdbc.Util.sqlException().

هذا هو الجزء الغريب حقًا: حاولت تفكيك CASE بيان إلى قطع مع 100 على سبيل المثال عندما تتبع الجمل ELSE ( CASE foo WHEN ... ) END. ولكن حتى مع إعادة الكتابة أحصل بالضبط نفس السلوك!

لا أرى أي إشارة إلى حد 1000 أو أي شيء آخر في دليل HSQLDB. مساعدة!

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

المحلول

يجب ألا تحصل على أي مكان بالقرب من 1000 مصطلح في CASE بيان. قبل ذلك بوقت طويل ، يجب عليك وضع القيم الأخرى في جدول منفصل وتختارها عن طريق الانضمام.

INSERT INTO MappingTable (foo, string) VALUES
  ('a', 'bar'), ('b', 'biz'), ...

SELECT COALESCE(m.string, 'fin')
FROM MyTable t LEFT OUTER JOIN MappingTable m USING (foo)
LIMIT 1;

يقول Java API عن Stackoverflowerror:

يتم إلقاؤه عند حدوث فائض مكدس لأن التطبيق يتكرر بعمق.

لذلك أعتقد أنه عندما يخفف HSQLDB CASE التعبير ، كل WHEN يضيف المصطلح طبقة أخرى إلى مكدس وقت التشغيل (في الواقع ربما عدة طبقات لكل WHEN).

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

من المحتمل أن يكون الحد الأقصى البالغ 1000 متغيرًا ، اعتمادًا على تنفيذ Java VM ، وإصدار Java ، والمنصة التي تقوم بتشغيلها ، ومقدار الذاكرة المتاحة ، وما إلى ذلك. لا يجوز لها توثيقها في وثائق HSQLDB لأنها حد خاص منصة ، وليس شيء مدمج في HSQLDB.

نصائح أخرى

القضاء على بيان الحالة تماما.

قم بعمل جدول باستخدام هذه القيم 1000 ، ثم قم فقط بالانضمام الداخلي إلى هذا الجدول.

كما قال بيل ، من المستحيل إزالة الحد الأقصى بالنظر إلى تصميم محلل HSQL الظاهر.

فيما يتعلق بالتخفيف من الحد الأقصى (أي السماح لنفسك بالوصول إلى 1000 مفتاح بمجرد دفع الحد إلى ... في مكان ما أكثر من 1000) ، لديك خياران.

  1. قم بزيادة حجم المكدس في VM عند تشغيل التطبيق الخاص بك. إذا كنت تستخدم نقطة Hotspot VM من Sun ، فيجب أن تكون قادرًا على المرور على سبيل المثال -xx: ThreadStackSize = 1024 لاستخدام مكدس 1 ميجابايت لكل مؤشر ترابط ، بدلاً من 512 كيلو بايت. قد يتيح لك الحصول على عمق عودية أكبر.
  2. يمكنك تشغيل عملك في مؤشر ترابط تم إنشاؤه بواسطة مؤشر ترابط المنشئ (ThreadGroup ، Runnable ، String ، Long) ، حيث تكون المعلمة الأخيرة عبارة عن حجم مكدس مطلوب. هذا قد يعمل أو لا يعمل ؛ إذا قرأت Javadoc ، فهذا اقتراح - VMs نرحب أكثر من تجاهل هذا الطلب. لست متأكدًا من ما تفعله نقطة الساخنة على وجه التحديد ، ولكن قد يساعد ذلك.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top