どのように1000項目以上にHSQLDB場合。
-
22-07-2019 - |
質問
私は、以下のクエリに極超音速DB(HSQLDB):
SELECT (CASE foo WHEN 'a' THEN 'bar' WHEN 'b' THEN 'biz' ....
ELSE 'fin' END ) FROM MyTable LIMIT 1
場合の数"の場合"の条項を超える約1000人にとってのJava 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:
場合にスローされるスタックオーバーフローが発生用recursesもっています。
うにしたものではないでしょうかその時のHSQLDBを解析し、 CASE
表現、 WHEN
期に追加レイヤー別のランタイムスタックを実際にそらく何層にも当たり WHEN
).
いか類似のStackOverflowErrorした場合は、演算表現1,000レベルは入れ子のしるしをつけることになる。
上限1,000であろう変数によっては、実施のJava VMのバージョンのJava、プラットフォームまで、メモリの量、等られなかったり、文献でのHSQLDBの文書では、プラットフォーム固有の限界というのは内蔵のHSQLDB.
他のヒント
CASEステートメントを完全に削除します。
これらの1000個の値を使用してテーブルを作成し、そのテーブルに内部結合を行います。
ビルが言ったように、明らかなHSQLパーサーの設計を考えると、制限を削除することは不可能です。
制限を緩和する(つまり、制限を1000を超えるまで押し上げることで1000個のスイッチに到達できるようにする)という点では、2つのオプションがあります。
- アプリの実行時にVMのスタックサイズを増やします。 SunのHotspot VMを使用している場合は、たとえば-XX:ThreadStackSize = 1024は、デフォルトの512Kではなく、スレッドごとに1MBスタックを使用します。これにより、再帰の深さがより深くなります。
- コンストラクタThread(ThreadGroup、Runnable、String、long)によって作成されたスレッドで作業を実行できます。最後のパラメーターは要求されたスタックサイズです。これは機能する場合と機能しない場合があります。 Javadocを読んでいる場合、これは提案です。VMはこの要求を無視してもかまいません。 Hotspotが具体的に何をするかはわかりませんが、役に立つかもしれません。