Ошибка ORA-12705 и ORA-00604 в производстве

У нас есть следующая ошибка ORA, где сообщение об ошибке выводится на другом языке. Это происходит очень редко, и нам придется перезапустить наши серверы приложений. В своем анализе я мог понять, что при подключении к базе данных JDBC внутренне изменяет сеанс, принимая языковой стандарт пользователя, как показано ниже.

ALTER SESSION SET TIME_ZONE='America/Los_Angeles' NLS_LANGUAGE='LATIN AMERICAN SPANISH' NLS_TERRITORY='LAOS'

Команда Oracle сообщает, что не существует языка под названием ЛАТИНСКО-АМЕРИКАНСКИЙ ИСПАНСКИЙ, проверьте со стороны приложения, где он установлен. Нам трудно понять, где это происходит.

Краткое описание моего проекта: это веб-приложение, разработанное с использованием следующего технического стека. 1. Oracle 11g 2. Spring MVC 3.2.3 3. Hibernate 3.5.6 4. Серверы приложений JBOSS с кластеризацией.

Ниже приведены журналы, извлеченные из команды DB.

*** 2016-05-26 05:23:40.831
*** SESSION ID:(58.51587) 2016-05-26 05:23:40.831
*** CLIENT ID:() 2016-05-26 05:23:40.831
*** SERVICE NAME:(NACCO) 2016-05-26 05:23:40.831
*** MODULE NAME:(JDBC Thin Client) 2016-05-26 05:23:40.831
*** ACTION NAME:() 2016-05-26 05:23:40.831

dbkedDefDump(): Starting a non-incident diagnostic dump (flags=0x0, level=3,    mask=0x0)
----- Error Stack Dump -----
ORA-12705: No se puede acceder a los archivos de datos NLS o se ha especificado un entorno no válido
----- Current SQL Statement for this session (sql_id=b6m5bkmu49p0j) -----
ALTER SESSION SET TIME_ZONE='America/Los_Angeles' NLS_LANGUAGE='LATIN  AMERICAN SPANISH' NLS_TERRITORY='LAOS'

Нам очень трудно выяснить первопричину и устранить ее. Будем признательны, если кто-то может помочь нам в исправлении или воспроизведении этой проблемы на местном уровне. Заранее спасибо.

Трассировка стека исключений для справки

java.lang.Exception: Exception Identifier : 7843441347475577703, java.sql.SQLException: ORA-00604: se ha producido un error a nivel 1 de SQL recursivo

ORA-12705: Нет доступа к архивам данных NLS или другим лицам.

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:450)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:392)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:385)
    at oracle.jdbc.driver.T4CTTIfun.processError(T4CTTIfun.java:1018)
    at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:497)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:522)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:433)
    at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:950)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:639)
    at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:662)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:560)
    at org.jboss.resource.adapter.jdbc.local.LocalManagedConnectionFactory.createManagedConnection(LocalManagedConnectionFactory.java:172)
    at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.createConnectionEventListener(InternalManagedConnectionPool.java:619)
    at org.jboss.resource.connectionmanager.InternalManagedConnectionPool.getConnection(InternalManagedConnectionPool.java:264)
    at org.jboss.resource.connectionmanager.JBossManagedConnectionPool$BasePool.getConnection(JBossManagedConnectionPool.java:575)
    at org.jboss.resource.connectionmanager.BaseConnectionManager2.getManagedConnection(BaseConnectionManager2.java:347)
    at org.jboss.resource.connectionmanager.TxConnectionManager.getManagedConnection(TxConnectionManager.java:330)
    at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:402)
    at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:849)
    at org.jboss.resource.adapter.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:89)
    at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1463)
    at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:555)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at com.sun.proxy.$Proxy159.findUserByName(Unknown Source)
    at tavant.twms.web.actions.ManageSSO.createOrUpdateUser(ManageSSO.java:112)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:453)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:292)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:255)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at tavant.twms.interceptor.TrimListByElementIdInterceptor.intercept(TrimListByElementIdInterceptor.java:44)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:211)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:90)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at tavant.twms.interceptor.TwmsFileUploadInterceptor.intercept(TwmsFileUploadInterceptor.java:44)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at tavant.twms.interceptor.BUSpecificLabelsLocaleInterceptor.intercept(BUSpecificLabelsLocaleInterceptor.java:109)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:192)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:249)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:511)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at tavant.twms.filter.ResponseTimeLogFilter.doFilter(ResponseTimeLogFilter.java:90)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:143)
    at org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at tavant.twms.filter.SelectedBusinessUnitsFilter.doFilter(SelectedBusinessUnitsFilter.java:39)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
    at java.lang.Thread.run(Thread.java:662)

Все, у нас есть следующие системные свойства, которые устанавливаются на всех моих производственных серверах, однако мы все еще сталкиваемся с этой проблемой.

user.language: en
user.country: US
user.timezone: America/Los_Angeles

Любая помощь будет оценена по достоинству.

Спасибо, навин


person Naveen    schedule 21.06.2016    source источник
comment
Почему вы вообще меняете сеанс?   -  person M. Deinum    schedule 21.06.2016
comment
Деинум - мы не меняем сеанс. Hibernate / JDBC из приложения изменяет его внутренне. ссылка   -  person Naveen    schedule 21.06.2016
comment
Я предполагаю серверное приложение с пулом соединений, поэтому ничего не должно измениться. Зачем подключению изменять сеанс с локалью? Я бы сказал, что в настоящее время информации слишком мало (например, добавьте полную трассировку стека). И при чем тут Spring и / или hibernate? Если это так важно, добавьте часть этой конфигурации.   -  person M. Deinum    schedule 21.06.2016
comment
Спасибо за ответ Deinum !. Я обновил трассировку стека с полной информацией. Эта проблема носит спорадический характер и начинается сначала в регионе EMEA (Европа), и затрагивает все остальные регионы. У нас было несколько обращений к группам поддержки Oracle, и они сказали, что это происходит со стороны приложений. Первый журнал тоже говорит о том же. Я понял, что ссылка, приведенная в моем предыдущем комментарии, помогла мне изменить сеанс JDBC / Hibernate перед установкой соединения. Кстати, наши серверы находятся в районе PDT.   -  person Naveen    schedule 21.06.2016
comment
Я не понимаю, почему это могло произойти, особенно если у вас настроен пул соединений на стороне сервера. Добавьте некоторую конфигурацию / код, так как в настоящее время слишком мало информации.   -  person M. Deinum    schedule 21.06.2016
comment
Да Deinum вы правы, серверное приложение с пулом подключений.   -  person Naveen    schedule 21.06.2016
comment
Хмм, похоже, поведение оракула по умолчанию для входа в систему (что может произойти, когда в пуле используются все его соединения и его необходимо масштабировать). Вы можете переопределить / добавить триггер для изменения параметров NLS после входа в систему по умолчанию вместо того, который у вас есть сейчас.   -  person M. Deinum    schedule 21.06.2016
comment
Цените свое время Deinum. Не могли бы вы сообщить мне, где я могу изменить материал NLS. Я думаю поместить эти значения в переменную окружения ОС или отправить как параметры виртуальной машины в конфиг-оболочке. Пожалуйста, дайте мне знать, правильно ли я думаю. Спасибо   -  person Naveen    schedule 21.06.2016
comment
Погуглите, есть разные решения, также вы не сможете решить это на стороне java, вам нужно исправить это на стороне БД, правильно настроив БД.   -  person M. Deinum    schedule 21.06.2016
comment
Спасибо Deinum. я сделаю это   -  person Naveen    schedule 21.06.2016
comment
Проверьте эту ссылку. Это может быть полезно community.oracle.com/thread/2212427   -  person phonetic_man    schedule 21.06.2016
comment
Попробуйте установить правильную переменную среды NLS_LANG на стороне сервера приложений. Подробнее см. Здесь: orafaq.com/wiki/NLS_LANG. Если он не установлен явно, JDBC заимствует языковые настройки непосредственно из операционной системы (Windows или Linux?).   -  person krokodilko    schedule 21.06.2016


Ответы (1)


При установлении соединения с базой данных тонкий драйвер Oracle JDBC ищет языковой стандарт Java по умолчанию, извлекает язык и территорию и выполняет ALTER SESSION, чтобы установить NLS_LANGUAGE и NLS_TERRITORY.

У меня это работает очень хорошо: я француз, я живу в Париже, и когда я подключаюсь к базе данных в США, я автоматически получаю сообщения об ошибках на французском языке, потому что мой языковой стандарт установлен на французский / Франция.

Тонкий драйвер вызывает Locale.getDefault(Category.FORMAT) и оттуда определяет язык и территорию.

Я попытался установить свой языковой стандарт на es/419, выполнив это Locale.setDefault(new Locale("es","419"));, и я вижу, что драйвер выполняет следующий запрос:

ALTER SESSION SET TIME_ZONE='Europe/Paris' NLS_LANGUAGE='LATIN AMERICAN SPANISH' NLS_TERRITORY='AMERICA'

(Мы можем игнорировать часовой пояс)

Эти швы отлично подходят для моей установки. Если в вашем нет, возможно, вы можете попробовать другой язык. Вы можете изменить язык по умолчанию, установив системные свойства user.language и user.country при запуске среды выполнения Java.

Например, если я сделаю это:

java -Duser.language=es -Duser.country=ES ...

то при подключении драйвер выполняет следующий запрос:

ALTER SESSION SET TIME_ZONE='Europe/Paris' NLS_LANGUAGE='SPANISH' NLS_TERRITORY='SPAIN'

es_ES должно быть очень распространенным явлением, и я был бы шокирован, если бы это не сработало в вашей среде.

Я понимаю, что вы используете JBOSS, поэтому эти два -D системных свойства должны быть установлены в командной строке, запускающей JBOSS. Обратите внимание: если вы предпочитаете, вы также можете добиться того же из своего кода, вызвав Locale.setDefault.

Удачи!

person Jean de Lavarene    schedule 21.06.2016
comment
Большое спасибо @Jean за подробное объяснение. Я получил список языков и стран от службы поддержки Oracle, где я понял, что возникла проблема с территорией. ** ALTER SESSION SET TIME_ZONE = 'America / Los_Angeles' NLS_LANGUAGE = 'LATIN AMERICAN SPANISH' NLS_TERRITORY = 'LAOS' **. Со стороны оракула нет территории, называемой ЛАОС. Я попробую ваше предложение и буду в курсе. - person Naveen; 22.06.2016
comment
FYI Он пробовал с -Duser.language=es -Duser.country=LA, и он успешно выполняется ALTER SESSION SET TIME_ZONE='Europe/Paris' NLS_LANGUAGE='LATIN AMERICAN SPANISH' NLS_TERRITORY='LAOS' в моей базе данных 12.1.0.2. Обходной путь в вашем случае - изменить территорию на ту, которая работает. - person Jean de Lavarene; 22.06.2016
comment
Спасибо, Жан. Я просто проверяю, как установить территорию, если у вас есть хорошие руки, дайте мне знать. - person Naveen; 22.06.2016
comment
Системное свойство -Duser.country устанавливает страну в локали (например, java -Duser.country=LA ... для Лаоса), которая затем используется драйвером для установки NLS_TERRITORY. Здесь есть список: mindprod.com/jgloss/countrycodes.html - person Jean de Lavarene; 22.06.2016
comment
Джин, я проверил свои производственные серверы и вижу, что все вышеперечисленные значения уже установлены, но мы все еще сталкиваемся с этой проблемой. - person Naveen; 05.07.2016
comment
Вы пробовали другую территорию, чтобы увидеть, имеет ли это значение? -Duser.country=VN (для Вьетнама). - person Jean de Lavarene; 06.07.2016
comment
Жан, я не могу сделать это изменение сразу, я смогу внести это изменение в следующем производственном выпуске. Я попробую ваше предложение и дам вам знать. Спасибо за ваше время. - person Naveen; 08.07.2016