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
Deinum - ние не променяме сесията. Hibernate/JDBC от приложението го променя вътрешно. връзка   -  person Naveen    schedule 21.06.2016
comment
Предполагам сървърно приложение с набор от връзки, така че нищо не трябва да се променя. Защо get connect ще променя сесията с локала? Бих казал, че в момента има твърде малко информация (добавете например пълното проследяване на стека). Освен това какво общо има 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 нещата. Мисля да поставя тези стойности в променливата на околната среда на OS или да изпратя като VM опции в wrapper conf. Моля, уведомете ме дали мисля правилно. Благодаря   -  person Naveen    schedule 21.06.2016
comment
Потърсете малко в Google, има различни решения, също така няма да можете да го разрешите от страна на java, трябва да го поправите от страната на DB, като настроите правилно DB.   -  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 е настроен на french/France.

Тънкият драйвер извиква 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'

(Можем да игнорираме time_zone)

Това изглежда работи добре в моята настройка. Ако не е на вашия, може би можете да опитате друг език. Можете да промените езика по подразбиране, като зададете системните свойства 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'**. Няма територия, наречена 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