2010-03-16 167 views
0

这在一些遗留Java应用程序(HP-UX上的jre1.4)中已被注意到。在Java进程中更改了环境变量(NLS_LANG)值?

父进程(shell脚本S1)正在启动Java进程,它自己启动子进程(shell脚本S2)。示意图如下:S1> Java> S2

注意! Java应用程序使用OCI驱动程序连接到Oracle DB。

什么是这里的怪是运行S1这一过程有环境变量NLS_LANG设置为american_america.BLT8MSWIN1257,Java的滋生S2使用:

Runtime.getRuntime().exec(cmd); 

和S2显示NLS_LANG设置为american_america.UTF8

(!)

这发生在一些有限的访问环境(生产)上,我无法在jre 1.5上重现与linux相同的问题。 AFAIK,Java进程应该从其父节点(S1)继承环境,并且应该将所有环境变量传递给其子节点S2(因为使用了单参数exec调用)。但是,似乎并非如此。任何想法为什么NLS_LANG似乎被改变?

回答

1

系统中是否有任何登录触发器?在登录触发器中设置很多环境变量(通常是NLS _ * _ FORMAT)以避免依赖系统行为的环境配置是非常常见的。

SELECT * FROM DBA_TRIGGERS 
WHERE TRIGGERING_EVENT = 'LOGON'; 
+0

恐怕我目前无法检查这个选择,但是您能否解释一下如何使用数据库触发器更改某个Unix进程的环境? – Ralkie 2010-03-17 08:35:14

+0

如果我不清楚,我很抱歉; Unix环境变量未被修改,但NLS_LANG参数可以在Oracle会话的上下文中修改。它可以从调用进程继承,在所有情况下由客户端设置,或由数据库触发器覆盖。 – 2010-03-17 13:51:41

0

由于NLS_LANG由父出口,我会认为它是由孩子继承。在这种情况下,您正在寻找一些启动脚本正在触发某处,正在用american_america.UTF8覆盖它。我会寻找一个.cshrc(或类似的,取决于什么外壳S2)。可能位于用户区域或/ etc全局区域中。

+0

检查,没有发现任何东西。不管怎么说,还是要谢谢你 :) – Ralkie 2010-03-20 12:39:25