Java 응용 프로그램에서 Oracle 데이터베이스에 액세스하고 있는데 응용 프로그램을 실행할 때 다음 오류가 발생합니다.
java.sql.SQLException : ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다. ORA-01882 : 시간대 영역을 찾을 수 없습니다.
답변
Oracle jdbc 드라이버 및 Oracle 데이터베이스의 버전을 확인할 수도 있습니다. 오늘 바로 ojdbc6.jar (버전 11.2.0.3.0)을 사용하여 Oracle 9.2.0.4.0 서버에 연결할 때이 문제가 발생했습니다. ojdbc6.jar 버전 11.1.0.7.0으로 바꾸면 문제가 해결되었습니다.
또한 oracle.jdbc.timezoneAsRegion=false
oracle / jdbc / defaultConnectionProperties.properties 파일 (jar 내부) 을 추가하여 ojdbc6.jar 버전 11.2.0.3.0을 오류없이 연결하도록 관리했습니다 . 여기 에서이 솔루션을 찾았 습니다.
마지막 으로이 표기법을 사용하는 구성 파일 -Doracle.jdbc.timezoneAsRegion=false
의 명령 줄 또는 AddVMOption -Doracle.jdbc.timezoneAsRegion=false
에 추가 할 수 있습니다.
답변
일반 SQL 개발자 설치에서 Windows에서 디렉토리로 이동
C:\Program Files\sqldeveloper\sqldeveloper\bin
추가
AddVMOption -Duser.timezone=CET
파일에 sqldeveloper.conf
.
답변
내가 얻은 오류 :
db_connection.java 오류->> java.sql.SQLException : ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다. ORA-01882 : 시간대 영역을 찾을 수 없습니다.
ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다 ORA-01882 : 시간대 영역을 찾을 수 없습니다
이전 코드 :
public Connection getOracle() throws Exception {
Connection conn = null;
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:tap", "username", "pw");
return conn;
}
새 코드 :
public Connection getOracle() throws Exception {
TimeZone timeZone = TimeZone.getTimeZone("Asia/Kolkata");
TimeZone.setDefault(timeZone);
Connection conn = null;
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:tap", "username", "pw");
return conn;
}
이제 작동합니다 !!
답변
아래 행을 포함하기 위해 사용중인 라이브러리 버전 (즉, jar 내부)에서 oracle / jdbc / defaultConnectionProperties.properties 파일을 업데이트하십시오 .
oracle.jdbc.timezoneAsRegion=false
답변
일어나는 일은 JDBC 클라이언트가 시간대 ID를 서버에 보내는 것입니다. 서버는 해당 영역을 알아야합니다. 다음으로 확인할 수 있습니다.
SELECT DISTINCT tzname FROM V$TIMEZONE_NAMES where tzname like 'Etc%';
‘Etc / UTC’및 ‘UTC'(tzfile 버전 18)에 대해 알고있는 일부 db 서버가 있지만 다른 일부는 ‘UTC'(tz 버전 11) 만 알고 있습니다.
SELECT FILENAME,VERSION from V$TIMEZONE_FILE;
JDBC 클라이언트 측에서도 다른 동작이 있습니다. 11.2부터 드라이버는 시간 오프셋을 전송하기 전에 Oracle에 “알려진”영역 ID를 전송합니다. 이 “알려진 ID 전송”의 문제점은 클라이언트가 서버에있는 시간대 버전 / 컨텐츠를 확인하지 않고 자체 목록을 가지고 있다는 것입니다.
이는 Oracle 지원 문서 [ID 1068063.1]에 설명되어 있습니다.
또한 클라이언트 OS에 의존하는 것처럼 보이며 RHEL 또는 Windows보다 Ubuntu에서 Etc / UTC가 실패 할 가능성이 더 큽니다. 나는 이것이 약간의 정규화 때문이라고 생각하지만 정확히 무엇을 알지 못했습니다.
답변
-
이클립스에서 실행 -> 구성 실행
-
오른쪽 패널의 JRE 탭으로 이동합니다.
-
에서 VM 인수 섹션이 붙여 넣기
-Duser.timezone=GMT
-
그런 다음 적용-> 실행
답변
지속적 통합 서버에서 자동화 된 테스트를 실행할 때이 문제가 발생했습니다. -Duser.timezone=GMT
빌드 매개 변수에 VM 인수 ” “를 추가하려고했지만 문제가 해결되지 않았습니다. 그러나 환경 변수 ” TZ=GMT
“를 추가하면 문제가 해결되었습니다.