Java 응용 프로그램에서 Oracle 데이터베이스에 액세스하고 있는데 응용 프로그램을 실행할 때 다음 오류가 발생합니다.
java.sql.SQLException : ORA-00604 : 재귀 SQL 레벨 1에서 오류가 발생했습니다. ORA-01882 : 시간대 영역을 찾을 수 없습니다.
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
에 추가 할 수 있습니다.
내가 얻은 오류 :
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
"를 추가하면 문제가 해결되었습니다.
Netbeans에서는
확인을 클릭 한 다음 프로그램을 다시 실행하십시오.
참고 : UTC 및 GMT 이외의 다른 타임 스톤으로 설정할 수도 있습니다.
나는 또한 비슷한 문제에 직면했습니다.
oracle 11g 데이터베이스를 쿼리하는 동안 Linux, 최대 절전 모드 프로젝트, ojdbc6 드라이버.
TZ 매개 변수는 기본적으로 Oracle에게 시간대에 대해 알려주는 Linux 시스템에서 설정되지 않았습니다. 그래서 응용 프로그램 시작시 내보내기 문구 "export TZ = UTC"를 추가하면 내 문제가 해결되었습니다.
UTC-> 시간대에 맞게 변경하십시오.
이 문제가 JDeveloper에있는 경우 : 모델 및 뷰 프로젝트 모두에 대한 프로젝트 속성 변경-> 실행 / 디버그-> 기본 프로필-> 편집 다음 실행 옵션 추가 : -Duser.timezone = Asia / Calcutta
위의 시간대 값이 다음과 같이 데이터베이스에서 가져 왔는지 확인합니다.
select TZNAME from V$TIMEZONE_NAMES;
이와 함께 jdev.conf 및 JDeveloper-> 애플리케이션 메뉴-> 기본 프로젝트 속성-> 실행 / 디버그-> 기본 프로필-> 실행 옵션에서 시간대 설정을 확인하고 싶습니다.
JDeveloper에서 연결을 만들려고 할 때도 같은 문제가 발생했습니다. 서버가 다른 시간대에 있으므로 다음과 같은 오류가 발생했습니다.
ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found
프로젝트 속성 및 기본 프로젝트 속성의 Java 옵션 (실행 / 디버그 / 프로필)에 시간대를 포함하도록 요청한 많은 포럼을 b -Duser.timezone="+02:00"
하지만 작동하지 않았습니다. 마지막으로 다음 솔루션이 저에게 효과적이었습니다.
JDeveloper의 구성 파일 ( jdev.conf )에 다음 줄을 추가합니다 .
AddVMOption -Duser.timezone=UTC+02:00
파일은 "<oracle 설치 루트> \ Middleware \ jdeveloper \ jdev \ bin \ jdev.conf"에 있습니다.
Linux 시스템 (Centos6.5)에서 시간대를 설정하여 동일한 문제를 해결할 수있었습니다.
재 게시
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html
/etc/sysconfig/clock
예를 들어 ZONE = "America / Los_Angeles"로 설정된 시간대 설정
sudo ln -sf / usr / share / zoneinfo / America / Phoenix / etc / localtime
시간대 값을 알아 내려면
ls /usr/share/zoneinfo
시간대를 나타내는 파일을 찾으십시오.
이러한 설정을 완료하면 시스템을 재부팅하고 다시 시도하십시오.