BadImageFormatException,如果在安装32位oracle客户端组件的情况下以64位模式运行,将出现此问题

今天开发人员发过来个问题,如题,现场是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

 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值