在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)
在ASP.NET MVC 4 on Mono中使用OracleClient in CentOS 6.x的问题记录的更多相关文章
- 【问题】Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数
[问题]Asp.net MVC 的cshtml页面中调用JS方法传递字符串变量参数. [解决]直接对变量加引号,如: <button onclick="deleteProduct('@ ...
- Asp.net MVC 4新项目中创建area的后续操作
Asp.net MVC 4新项目中创建area后,往往HomeController与area的HomeController路由发生混淆,需要手工设置一些地方避免mvc无法识别默认路由的状况. 无废话具 ...
- 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds
RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发 ...
- ASP.NET MVC 在子页中引用头文件
在很多时候我们把网站公共的js.css文件放在模板页中,这样在具体的每一个页面里面就不需要单独引用. ASP.NET WebForm里面使用.site文件. 而在ASP.NET MVC 中使用了类似下 ...
- ASP.NET MVC 3和Razor中的@helper 语法
原文:http://kb.cnblogs.com/page/102191/ ASP.NET MVC 3支持一项名为"Razor"的新视图引擎选项(除了继续支持/加强现有的.aspx ...
- 蒋金楠How ASP.NET MVC Works?[持续更新中…]
一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在“伪”M ...
- asp.net mvc放在iis7.5中提示404错误 js异步请求失效解决办法
asp.net mvc中js发请求一般写成: $.get("/Can/index"本地上是没有问题的但是部署到iis上,提示404,正确的请求的路径是:/网站名/Can/index ...
- ASP.NET MVC和Web API中的Angular2 - 第2部分
下载源码 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索,全局错误处理,调试客 ...
- ASP.NET MVC和Web API中的Angular2 - 第1部分
下载源码 - 903.5 KB 内容 第1部分:Visual Studio 2017中的Angular2设置,基本CRUD应用程序,第三方模态弹出控件 第2部分:使用Angular2管道进行过滤/搜索 ...
随机推荐
- Jquery的点击事件,三句代码完成全选事件
先来看一下Js和Jquery的点击事件 举两个简单的例子 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...
- 我的MYSQL学习心得(一) 简单语法
我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...
- CI Weekly #10 | 2017 DevOps 趋势预测
2016 年的最后几个工作日,我们对 flow.ci Android & iOS 项目做了一些优化与修复: iOS 镜像 cocoapods 版本更新: fir iOS上传插件时间问题修复: ...
- JavaScript的继承实现方式
1.使用call或apply方法,将父对象的构造函数绑定在子对象上 function A(){ this.name = 'json'; } function B(){ A.call(this); } ...
- Openfiler配置RAC共享存储
将 Openfiler 用作 iSCSI 存储服务器,主要操作步骤如下: 1.设置 iSCSI 服务 2.配置网络访问 3.指定物理存储器并对其分区 4.创建新的卷组 5.创建所有逻辑卷 6.为每个逻 ...
- [原] KVM虚拟机网络闪断分析
背景 公司云平台的机器时常会发生网络闪断,通常在10s-100s之间. 异常情况 VM出现问题时,表现出来的情况是外部监控系统无法访问,猜测可能是由于系统假死,OVS链路问题等等.但是在出现网络问题的 ...
- docker4dotnet #3 在macOS上使用Visual Studio Code和Docker开发asp.net core和mysql应用
.net猿遇到了小鲸鱼,觉得越来越兴奋.本来.net猿只是在透过家里那田子窗看外面的世界,但是看着海峡对岸的苹果园越来越茂盛,实在不想再去做一只宅猿了.于是,.net猿决定搭上小鲸鱼的渡轮到苹果园去看 ...
- 烂泥:jira7.2安装、中文及破解
. jira的主要配置文件,存放在/opt/atlassian/jira/conf/server.xml文件中,如下: vim /opt/atlassian/jira/conf/server.xml ...
- Lesson 22 A glass envolops
Text My daughter, Jane, never dreamed of receiving a letter from a girl of her own age in Holland. L ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...