#sql #oracle #oracle11g #oracle-sqldeveloper
#Oracle #jdbc #Часовой пояс
Вопрос:
Я обращаюсь к базе данных Oracle из приложения Java, когда я запускаю свое приложение, я получаю следующую ошибку:
java.sql.SQLException: ORA-00604: произошла ошибка при рекурсивном SQL уровня 1 ORA-01882: регион часового пояса не найден
Комментарии:
1. Расскажите нам о вашей среде, как вы запускаете свою Java?
2. Я запускаю Java-приложение в командной строке. 64-разрядная версия Windows 7, но Oracle DB работает на удаленном сервере Unix.
3. попробуйте добавить «-Duser.timezone=<YOUR_GMT>» в свою команду, не забудьте заменить <YOUR_GMT> на ваш GMT, т.е. -Duser.timezone=» 05:30″
Ответ №1:
Вы также можете попытаться проверить версию драйвера Oracle jdbc и базы данных Oracle. Только сегодня у меня возникла эта проблема при использовании ojdbc6.jar (версия 11.2.0.3.0) для подключения к серверу Oracle 9.2.0.4.0. Замена его на ojdbc6.jar версия 11.1.0.7.0 решила проблему.
Мне также удалось сделать ojdbc6.jar версия 11.2.0.3.0 подключается без ошибок, добавляя oracle.jdbc.timezoneAsRegion=false
в файл oracle/jdbc/defaultConnectionProperties.properties (внутри jar). Нашел это решение здесь (неработающая ссылка)
Затем можно добавить -Doracle.jdbc.timezoneAsRegion=false
в командную строку или AddVMOption -Doracle.jdbc.timezoneAsRegion=false
в конфигурационные файлы, которые используют это обозначение.
Вы также можете сделать это программно, например, с System.setProperty
помощью .
В некоторых случаях вы можете добавлять переменную среды для каждого соединения, если это разрешено (разработчик SQL разрешает это в «Расширенных» свойствах подключения; я проверил, что это работает при подключении к базе данных, у которой нет проблемы, и использовании ссылки на базу данных с базой данных, у которой есть).
Комментарии:
1. Мне также удалось сделать ojdbc6.jar версия 11.2.0.3.0 подключается без ошибок, добавив oracle.jdbc.timezoneAsRegion=false в файл oracle/jdbc/defaultConnectionProperties.properties (внутри jar). Нашел это решение здесь: forums.oracle.com/forums/thread.jspa?threadID=1095807
2. Наконец, можно добавить -Doracle.jdbc.timezoneAsRegion=false в командную строку или AddVMOption -Doracle.jdbc.timezoneAsRegion=false в конфигурационных файлах, которые используют это обозначение.
3. Спасибо stmsat. У меня это сработало. Я изменил свой jar ojdbc на версию 11.1.0.7.0 в каталоге tomcat / lib, и он начал работать :).
4. Я использую maven для сборки и упаковки (war) моего проекта и развертывания в Cloud Flare, можно ли каким-либо образом настроить это свойство из файла application.properties или из maven.
Ответ №2:
В простой установке SQL-разработчика под Windows перейдите в каталог
C:Program Filessqldevelopersqldeveloperbin
и добавьте
AddVMOption -Duser.timezone=CET
в файл sqldeveloper.conf
.
Комментарии:
1. Используя Jetbrains DataGrip и столкнувшись с той же проблемой после добавления этой опции виртуальной машины, проблема была решена
2. Спасибо, это действительно очень помогло!
Ответ №3:
Ошибка, которую я получил :
Ошибка db_connection.java —>> java.sql.SQLException: ORA-00604: произошла ошибка при рекурсивном SQL уровня 1 ORA-01882: регион часового пояса не найден
ORA-00604: произошла ошибка на рекурсивном уровне SQL 1ORA-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;
}
теперь он работает!!
Комментарии:
1. Спасибо, это именно то, что мне было нужно!
2. Я не знаю, почему ему не понравился часовой пояс по умолчанию «Европа / Мадрид». Установка часового пояса по умолчанию на «GMT» работает.
Ответ №4:
Обновите файл oracle/jdbc/defaultConnectionProperties.properties в любой версии используемой библиотеки (т. Е. Внутри вашего jar), чтобы он содержал строку ниже:
oracle.jdbc.timezoneAsRegion=false
Ответ №5:
Происходит то, что клиент JDBC отправляет идентификатор часового пояса на сервер. Сервер должен знать эту зону. Вы можете проверить с помощью
SELECT DISTINCT tzname FROM V$TIMEZONE_NAMES where tzname like 'Etc%';
У меня есть несколько серверов БД, которые знают о «Etc / UTC» и «UTC» (tzfile версии 18), но другие знают только «UTC» (tz версии 11).
SELECT FILENAME,VERSION from V$TIMEZONE_FILE;
На стороне клиента JDBC также наблюдается различное поведение. Начиная с версии 11.2, драйвер будет отправлять идентификаторы зон, если они «известны» Oracle, тогда как до этого он отправлял смещение по времени. Проблема с этой «отправкой известных идентификаторов» заключается в том, что клиент не проверяет, какая версия / содержимое часового пояса присутствует на сервере, но имеет свой собственный список.
Это объясняется в статье службы поддержки Oracle [ID 1068063.1].
Похоже, это также зависит от клиентской ОС, было более вероятно, что Etc / UTC не работает с Ubuntu, чем RHEL или Windows. Я предполагаю, что это связано с некоторой нормализацией, но я не понял, что именно.
Ответ №6:
-
в eclipse перейдите выполнить -> выполнить конфигурацию
-
там перейдите на вкладку JRE в правой боковой панели
-
в разделе Аргументы виртуальной машины вставьте это
-Duser.timezone=GMT
-
затем Применить -> Выполнить
Ответ №7:
У меня возникла эта проблема при запуске автоматических тестов с сервера непрерывной интеграции. Я попытался добавить аргумент виртуальной машины « -Duser.timezone=GMT
» к параметрам сборки, но это не решило проблему. Однако добавление переменной среды « TZ=GMT
» исправило это для меня.
Комментарии:
1. Переменная среды «TZ = GMT» также работала для меня. У меня возникли проблемы со сценарием оболочки, который настраивал среду для запуска отдельного инструмента, который, в свою очередь, обращался к Oracle.
2. Из-за той же проблемы мне тоже пришлось использовать «TZ = Europe / Zurich» при использовании «ant». Это сработало!
3. Это должен быть главный ответ. Все остальные ответы не сработали.
4. в docker это сработало для меня
TZ=America/Los_Angeles
5. Добавление TZ = IST сработало для меня, когда сборка jenkins, расположенная в GMT 2, пыталась получить доступ к базе данных, расположенной в Индии.
Ответ №8:
Я столкнулся с этой проблемой с Tomcat. Установка следующего в $CATALINA_BASE/bin/setenv.sh
решила проблему:
JAVA_OPTS=-Doracle.jdbc.timezoneAsRegion=false
Я уверен, что использование одного из предложений параметров Java из других ответов будет работать таким же образом.
Ответ №9:
ОШИБКА :
ORA-00604: произошла ошибка при рекурсивном SQL уровня 1 ORA-01882: регион часового пояса не найден
Решение: настройка CIM в Centos.
/opt/oracle/product/ATG/ATG11.2/home/bin/dynamoEnv.sh
Добавьте эти аргументы java:
JAVA_ARGS="${JAVA_ARGS} -Duser.timezone=EDT"
Ответ №10:
В Netbeans,
- Щелкните правой кнопкой мыши ваш проект -> Свойства
- Перейдите к запуску (в разделе Категории)
- Введите -Duser.timezone=UTC или -Duser.timezone=GMT в разделе Параметры виртуальной машины.
Нажмите Ok, затем повторно запустите свою программу.
Примечание: вы также можете установить другие временные интервалы, кроме UTC и GMT.
Ответ №11:
Если эта проблема в JDeveloper: измените свойства проекта как для модели, так и для проекта представления -> выполнить / отладка -> профиль по умолчанию -> редактировать добавьте следующий параметр запуска: -Duser.timezone=Азия / Калькутта
Убедитесь, что указанное выше значение часового пояса извлекается из вашей базы данных следующим образом:
select TZNAME from V$TIMEZONE_NAMES;
Наряду с этим вы хотели бы проверить настройки часового пояса в вашем jdev.conf, а также в JDeveloper -> Меню приложения -> Свойства проекта по умолчанию -> Выполнить / Отладка -> Профиль по умолчанию -> Параметры запуска.
Ответ №12:
Я также столкнулся с аналогичной проблемой.
Окружающая среда:
Linux, проект гибернации, драйвер ojdbc6 при запросе базы данных oracle 11g.
Разрешение
Параметр TZ не был установлен на компьютере Linux, который в основном сообщает oracle о часовом поясе. Итак, после добавления статуса экспорта «export TZ = UTC» во время запуска приложения моя проблема была решена.
UTC —> Измените в соответствии с вашим часовым поясом.
Ответ №13:
У меня была такая же проблема при попытке установить соединение на OBIEE с Oracle db. Я изменил часовой пояс Windows с (GMT 01:00) Западная Центральная Африка на (GMT 01:00) Брюссель, Копенгаген, Мадрид, Париж. Затем я перезагрузил свой компьютер, и он работал просто отлично. Похоже, Oracle не смог распознать часовой пояс западной и центральной Африки.
Ответ №14:
Эта проблема возникает, поскольку код, который пытается подключиться к БД, имеет часовой пояс, которого нет в БД. Это также можно решить, установив часовой пояс, как указано ниже, или любой допустимый часовой пояс, доступный в oracle db. допустимый часовой пояс, который можно найти, выберите * из версии v $;
System.setProperty(«user.timezone», «America / New_York»); TimeZone.setDefault(null);
Ответ №15:
У меня тоже была такая же проблема, когда я пытался создать соединение в JDeveloper. Наш сервер расположен в другом часовом поясе, и, следовательно, он вызвал следующие ошибки::
ORA-00604: error occurred at recursive SQL level 1
ORA-01882: timezone region not found
Я ссылался на многие форумы, которые просили включить часовой пояс в параметры Java (Run / Debug / Profile) свойств проекта и свойств проекта по умолчанию -Duser.timezone=" 02:00"
, но у меня это не сработало. Наконец, следующее решение сработало для меня.
Добавьте следующую строку в файл конфигурации JDeveloper (jdev.conf).
AddVMOption -Duser.timezone=UTC 02:00
Файл находится в «<корень установки oracle> Middleware jdeveloper jdev bin jdev.conf».
Ответ №16:
В моем случае я мог бы заставить запрос работать, изменив «TZR» на «TZD»..
String query = "select * from table1 to_timestamp_tz(origintime,'dd-mm-yyyy hh24:mi:ss TZD') between ? and ?";
Ответ №17:
Я смог решить ту же проблему, установив часовой пояс в моей системе 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
и найдите файл, который представляет ваш часовой пояс.
После установки этих параметров перезагрузите компьютер и повторите попытку.
Комментарии:
1. Для меня, чтобы убедиться, что /etc/sysconfig/clock и ссылка /etc/localtime были установлены правильно, было в основном необходимым условием для решения проблемы ORA-01882.
Ответ №18:
Столкнувшись с той же проблемой при использовании Eclipse и удаленной базы данных Oracle, изменение моего системного часового пояса в соответствии с часовым поясом сервера базы данных устранило проблему. Повторно запустите компьютер после смены системного часового пояса.
Я надеюсь, что это может кому-то помочь
Ответ №19:
java.sql.SQLException: ORA-00604: произошла ошибка при рекурсивном SQL уровня 1 ORA-01882: регион часового пояса не найден
Для такого типа ошибок просто измените системное время на стандартный формат GMT в вашей стране
например, индийский часовой пояс — Ченнаи, Калькутта.
Ответ №20:
Происходит, когда вы используете неправильную версию OJDBC jar.
Вам нужно использовать 11.2.0.4
Ответ №21:
В моем случае я установил часовой пояс на уровне моей ОС (ubuntu) с помощью этой команды.
timedatectl set-timezone {часовой пояс}
Например,
timedatectl set-timezone Africa/Kampala
Ответ №22:
Это может быть немного поздно, но это может кому-то помочь. Я столкнулся с этой проблемой во время работы с приложением spring-boot и не смог подключиться к базе данных Oracle.
Ошибка:
java.sql.SQLException: ORA-00604: произошла ошибка при рекурсивном SQL уровня 1
ORA-01882: регион часового пояса не найден
SELECT DBTIMEZONE FROM dual; -- This return: 00:00
timedatectl #The OS on the other hand returned correct time and timezone
Поскольку я не системный администратор и мне не разрешено изменять конфигурацию системы, мне пришлось применить обходной путь в кодах.
spring.datasource.hikari.data-source-properties.oracle.jdbc.timezoneAsRegion=false
#Added the above into the application property file
Рабочее решение взято из приведенной ниже ссылки
Редактировать
После того, как администратор базы данных исправил oracle отсутствующими исправлениями часового пояса, вышеуказанное (…timezoneAsRegion=false) больше не было нужно.
Ответ №23:
Для приложения с весенней загрузкой — // добавить ниже две строки
@SpringBootApplication
public class Application {
public static void main(String[] args) {
// add below two lines
System.out.println("Setting the timezone" TimeZone.getTimeZone("GMT 9:00").getID());
TimeZone.setDefault(TimeZone.getTimeZone("GMT 9:00"));
SpringApplication.run(Application.class, args);
}
}