今天开发人员发过来个问题,如题,现场是64位oracle+64位数据库主机+(32/64位?具体不能确定)应用+64位应用中间件服务器+32位oracle客户端。
这个问题按照字面来理解,就是安装了32位oracle客户端,但是试图以64位模式来运行。
百度了一圈,要么说改path,要么说安装64位客户端。众说纷纭,但是实际上都是针对当时作者所处的应用环境,来解决当时问题的方法,其他人照搬过来不一定能解决自己的问题。因此不能说这些方法错误,但至少没有触及到核心问题。既然让我碰见了,我来试着从从头到尾阐述一遍。
首先,问题的核心是:32位的oracle客户端,但是应用试图以64位的方式来调用。这是导致问题的本质。
然后,我们来说一说原理:
1,oracle数据库与oracle客户端之间没有32与64位版本匹配的问题,也就是说32位客户端可以访问64位数据库,反之亦然。
2,oracle客户端的32位与64位版本,需要与调用方一致。也就是说32位的程序使用32位客户端;64位的程序,使用64位客户端。这里我们需要了解一点,同一个程序,可能在开发的时候,使用32位,在生产部署的时候,会变成使用64位。这个我不是资深开发,不做过多讲解,后文会有专业文档说明。
3,同一个服务器主机,可以安装两个版本(32位/64位)的客户端,但是需要安装在不同oracle_home目录下,并且在安装完成后需要将两个oracle_home路径维护到path路径中。这里特别强调,两个oracle_home出现在path的前后顺序没有要求,任意。安装的时候,不能使用GUI的方式安装,需要使用命令行方式安装。因为GUI不提供设置oracle_home的功能。
这里补充一点:windows通过SYSWOW64子系统,提供了在64位windows系统上运行32位应用的能力,这么变态的行为,是给我们广大程序员造成崩溃的祸乱之源。哈哈。那么怎么看我们的程序是运行在32位或者64位之下呢?真相就藏在任务管理器中:打开进程选项卡,在进程名这一栏,如果进程名后面多了“ *32”,这样的字符,那就表示是跑在32位模式下了。如果没有的话,就是64位模式运行。
好了,原理说完了,其实理解了原理,解决方法也在里面了。各位看官是否理解?
2019年双12更新:
看到有人说问题看懂了但是没法解决,我想补充两点:
1,32位的程序需要安装32位的oracle客户端。这个必须要有,也好理解;
2,如果主机上已经装了64位的客户端,可以按照下文所述的安装方法,通过命令行的方式,指定一个新的oracle_home,将32位的客户端安装到新目录下。这样,同一台主机上就同时存在了64位与32位客户端。像这种共存的情况,需要设置windows环境变量ORACLE_HOME来指向32位的客户端。否则程序运行的时候,可能仍会找到64的客户端,并且问题仍无法解决。
setup.exe ORACLE_HOME_NAME=OraHome11g_client64
这里附上oracle官方对这个问题的说明文档。供有需要的人观看。谢谢!
Considerations Using The Oracle Client With Microsoft Products on 64 bit Windows Operating System (文档 ID 781432.1) |
In this Document |