在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录
来源: 阅读:831 次 日期:2014-08-28 14:39:54
温馨提示: 小编为您整理了“在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录”,方便广大网友查阅!

在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录

前言

最近有个Web项目,业务功能不复杂,但是这个客户(某政府部门)有两个硬性要求:1、数据库必须使用Oracle;2、程序必须运行在Linux或HP-Unix系统中。虽然把.NET程序跑在Linux中一直都是俺的自觉要求,之前也断续为此做了一些准备(我们自己的一些底层框架库已经在Linux中顺利跑起来了),但是把一个Web项目完整的移植到Mono in CentOS 6.x中确实没有过。

安装Oracle for Linux客户端

1、从Oracle官网下载:

oracle-instantclient12.1-basic-12.1.0.1.0-1.i386.rpm

oracle-instantclient12.1-sqlplus-12.1.0.1.0-1.i386.rpm

oracle-instantclient12.1-devel-12.1.0.1.0-1.i386.rpm

oracle-instantclient12.1-odbc-12.1.0.1.0-1.i386.rpm

使用 #> rpm -ivh ... 命令分别安装这几个rpm文件。完装完毕后,在 /usr/lib 目录中就会有个 oracle 目录了。

2、配置环境信息:

请打开 /etc/profile 文件,在这个文件里面追加如下内容:

export ORACLE_BASE=/usr/lib/oracle/12.1 #请注意,这里应填写为你的安装路径

export ORACLE_HOME=$ORACLE_BASE/client #请注意,这里应填写为你的安装路径

export ORACLE_SID=ortl #请注意,这里应填写你的SID值

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 #请注意,这里的字符集应该与你的数据库的字符集一致

编辑保存后,运行 #> source /etc/profile 命令使该profile立即生效;或者注销当前用户并重新登录Linux系统亦可。

3、指定.ora文件:

在 /usr/lib/oracle/12.1/client 目录中创建一个 network 目录,在其下再创建一个 admin 目录,然后将你的 tnsnames.ora 文件放置在此。

4、设置库路径

进入 /etc/ld.so.conf.d 目录中,新建一个名为 oracle-i386.conf 的文件,其内容只有一行文本:

/usr/lib/oracle/12.1/client/lib

然后在终端使用如下命令,重新加载配置文件:

#> ldconfig

5、检测是否安装成功

运行 sqlplus 命令,人品没问题的话应该可以看到类似下面这样的信息:

#> sqlplus

SQL*Plus: Release 12.1.0.1.0 Production on Sun Mar 16 01:49:42 2014

Copyright (c) 1982, 2013, Oracle. All rights reserved.

问题出现

我们的Web程序使用了 System.Data.OracleClient 下面的东东来访问Oracle数据库,这些代码在.NET in Windows下面可以正常工作,但是在 Mono in CentOS 6.x下面却罢工了,我在CentOS系统中使用的Web服务器是Jexus 5.4.0版本。

第一次访问页面的时候,报出的异常信息如下:

System.DllNotFoundException: libclntsh.so

at (wrapper managed-to-native) System.Data.OracleClient.Oci.OciCalls/OciNativeCalls:OCIEnvCreate (intptr&,System.Data.OracleClient.Oci.OciEnvironmentMode,intptr,intptr,intptr,intptr,int,intptr)

at System.Data.OracleClient.Oci.OciCalls.OCIEnvCreate (System.IntPtr& envhpp, OciEnvironmentMode mode, IntPtr ctxp, IntPtr malocfp, IntPtr ralocfp, IntPtr mfreep, Int32 xtramem_sz, IntPtr usrmempp) [0x00000] in :0

at System.Data.OracleClient.Oci.OciEnvironmentHandle..ctor (OciEnvironmentMode mode) [0x00000] in :0

at System.Data.OracleClient.Oci.OciGlue.CreateConnection (OracleConnectionInfo conInfo) [0x00000] in :0

at System.Data.OracleClient.OracleConnectionPoolManager.CreateConnection (OracleConnectionInfo info) [0x00000] in :0

at System.Data.OracleClient.OracleConnectionPool.CreateConnection () [0x00000] in :0

at System.Data.OracleClient.OracleConnectionPool.GetConnection () [0x00000] in :0

at System.Data.OracleClient.OracleConnection.Open () [0x00000] in :0

at System.Data.Common.DbDataAdapter.Fill (System.Data.DataTable dataTable, IDbCommand command, CommandBehavior behavior) [0x00000] in :0

at System.Data.Common.DbDataAdapter.Fill (System.Data.DataTable dataTable) [0x00000] in :0

at (wrapper remoting-invoke-with-check) System.Data.Common.DbDataAdapter:Fill (System.Data.DataTable)

再次刷新同样的页面,异常信息居然变成了:

System.NullReferenceException: Object reference not set to an instance of an object

at System.Data.OracleClient.OracleConnectionPool.GetConnection () [0x00000] in :0

at System.Data.OracleClient.OracleConnection.Open () [0x00000] in :0

at System.Data.Common.DbDataAdapter.Fill (System.Data.DataTable dataTable, IDbCommand command, CommandBehavior behavior) [0x00000] in :0

at System.Data.Common.DbDataAdapter.Fill (System.Data.DataTable dataTable) [0x00000] in :0

at (wrapper remoting-invoke-with-check) System.Data.Common.DbDataAdapter:Fill (System.Data.DataTable) at Citms.Data.DataAccess.ExecuteProcedure (System.Data.Common.DbConnection connection, System.String procedureName, Parameter[] paramers, System.Collections.Generic.Dictionary`2& outParamers) [0x00000] in :0

尼玛,这是什么节奏?换到MonoDevelop中运行,也报了几次这样的异常;然后果断在相关代码处设了断点再进入调试运行,居然、居然一切都顺利通过了,而且再次使用非调试运行也正常了!我勒了个去,这简直在挑战哥的三观,太不科学了!对此只能有一个解释:神功护体、RP爆表了!

再通过Jexus来访问系统,异常依旧;重启机器,还是不行。我开始怀疑是不是因为Jexus加载libclntsh.so库的时候没按照 LD_LIBRARY_PATH 设定的路径去找,然后就跑到Jexus的QQ群把这些问题现象通报询问了一遍,貌似没人搭理我。囧...

问题解决

晚上正打算下载 Mono for Apache module 的时候,怀着死马当活马医的心态下载升级了最新的Jexus 5.5.1,然后,那些异常消失了,系统完美运行起来了。尼玛,你是不是想说这也太没技术含量了(唉,就这还花了我不少时间的)…… 囧

环境说明

顺便交代下,在更新Jexus之前,我把CentOS做了个大升级,这是升级之后的系统信息:

#> cat /proc/version

Linux version 2.6.32-431.5.1.el6.i686 (mockbuild@c6b10.bsys.dev.centos.org) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Tue Feb 11 21:56:33 UTC 2014

#> cat /etc/centos-release

CentOS release 6.5 (Final)

我的 Mono 未做更新,其信息如下:

#> mono -V

Mono JIT compiler version 3.0.12 (tarball 2013年 07月 09日 星期二 18:49:58 CST)

Copyright (C) 2002-2012 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com

TLS: __thread

SIGSEGV: altstack

Notifications: epoll

Architecture: x86

Disabled: none

Misc: softdebug

LLVM: supported, not enabled.

GC: Included Boehm (with typed GC and Parallel Mark)

更多信息请查看IT技术专栏

更多信息请查看网络编程
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map