문의시기에 HSQLDB에서 1000 개 이상의 항목을 얻는 방법은 무엇입니까?

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

  •  22-07-2019
  •  | 
  •  

문제

Hypersonic 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 조항과 그 이후 ELSE ( CASE foo WHEN ... ) END. 그러나이 재 작성에도 불구하고 나는 얻는다 바로 그거죠 같은 행동!

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).

1,000 레벨의 중첩 괄호로 산술 표현식이 있으면 비슷한 stackoverflowerror를 얻을 수 있습니다.

1,000의 한계는 아마도 Java VM, Java 버전, 실행중인 플랫폼, 사용 가능한 메모리 양 등의 구현에 따라 가변적 일 수 있습니다. HSQLDB에 내장 된 것이 아니라 플랫폼 별 한도.

다른 팁

사례 진술을 완전히 제거하십시오.

그 1000 값을 사용하여 테이블을 만든 다음 해당 테이블에 내부 결합을하십시오.

빌이 말했듯이, 그것은 불가능합니다 제거하다 명백한 HSQL 파서 설계가 주어진 한도.

한계를 완화하는 측면에서 (즉, 한계를 1000 이상으로 밀어서 1000 스위치를 얻을 수있게 함) 두 가지 옵션이 있습니다.

  1. 앱을 실행할 때 VM의 스택 크기를 늘리십시오. Sun의 핫스팟 VM을 사용하는 경우 기본 512K 대신 스레드 당 1MB 스택을 사용하려면 EG -XX : ThreadStackSize = 1024를 통과 할 수 있어야합니다. 그것은 당신이 더 큰 재귀 깊이에 도달하게 할 수 있습니다.
  2. 마지막 매개 변수는 요청 된 스택 크기 인 생성자 스레드 (ThreadGroup, Runnable, String, Long)에 의해 생성 된 스레드에서 작업을 실행할 수 있습니다. 이것은 작동하거나 작동하지 않을 수 있습니다. Javadoc을 읽는 경우 제안입니다. VMS는이 요청을 무시하는 것을 환영합니다. 핫스팟이 구체적으로 어떤 일을하는지 잘 모르겠지만 도움이 될 수 있습니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top