最近做一个ASP.NET性能优化的小项目,目前还是在搭建测试环境,服务器使用WINDOWS2008,有2台AP server ,通过双网卡进行NLB组成集群,一台DB服务器,使用的是ORACLE 11g,然后客户还指出要使用ODP.NET。因为大多是使用的是SQL SERVER数据库,而以前接触ORACLE9i,10G时都是在Linux环境下,所以不太了解这个ODP.NET是个什么。 然后就查了查,发现好多东西都了解的不是很清楚,所以写篇文章吧了解到的写下来,可能有点杂碎吧。关于集群方面的等搭建完了在介绍介绍。
一 ODP.NET
ODP.NET全名是Oracle Data Provider,是Oracle发布的供.NET程序访问Oracle数据库的ADO.NET组件,比微软自带的Oracle组件性能好,更可以访问UDT(User Defined Type)类型,Procedure,REF等等高级Oracle特性。目前最新的版本是11g。在Oracle的官方网站可以下载。不过我都是跟随ODAC包一起下载下来的,关于ODAC后面介绍吧。
使用过.NET连接Oracle的都知道。一般都是使用OLEDB或者是.NET中提供的OracleClient来进行连接。我记得在.NET1.0中好像是没有包含OracleClient,需要单独下载,然后1.1中就有了,记得当时MSDN上有写。而微软也宣称,从.NET4.0开始放弃对OracleClient的支持,但不会删除,标记为不建议使用。 所以可以使用ORACLE提供的ADO.NET访问组件ODP.NET,组件的名字为OracleDataAccess.dll,oracle的使用和OracleClient完全一样,在程序中添加DLL引用就可以使用:
+ expand sourceview plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
using (OracleConnection conn = new OracleConnection(WebConfigurationManager.ConnectionStrings["oracleODP"].ConnectionString))
{
using (OracleCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select username, tel from demobs.test where username = '" + TextBox1.Text + "'";
conn.Open();
OracleDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
TextBox1.Text = reader.GetString(1);
}
}
}
using (OracleConnection conn = new OracleConnection(WebConfigurationManager.ConnectionStrings["oracleODP"].ConnectionString))
{
using (OracleCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select username, tel from demobs.test where username = '" + TextBox1.Text + "'";
conn.Open();
OracleDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
TextBox1.Text = reader.GetString(1);
}
}
}
上面一段代码,无论你使用OracleDataAccess.dll还是OracleClient.dll她都能正常工作,唯一不同可能是连接字符串的一点点区别了。
view plaincopy to clipboardprint?
<add name="oracle" connectionString="Data Source=CCDB;User Id=demobs;Password=demobs;Integrated Security=no;" providerName="System.Data.OracleClient"/>
<add name="oracle1" connectionString="SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.132.128)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=CCDB)));uid=demobs;pwd=demobs; " providerName="System.Data.OracleClient"/>
<add name="oracleODP" connectionString="Data Source=CCDB;User Id=demobs;Password=demobs;" providerName="Oracle.DataAccess.Client"/>
<add name="oracle" connectionString="Data Source=CCDB;User Id=demobs;Password=demobs;Integrated Security=no;" providerName="System.Data.OracleClient"/>
<add name="oracle1" connectionString="SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.132.128)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=CCDB)));uid=demobs;pwd=demobs; " providerName="System.Data.OracleClient"/>
<add name="oracleODP" connectionString="Data Source=CCDB;User Id=demobs;Password=demobs;" providerName="Oracle.DataAccess.Client"/>
其中第一个是OracleClient时使用的连接字符串,data source是在oracle客户端文件中配置的,第2个一样,只不过吧配置文件中的内容拿了出来,第3个是用于ODP.NET的链接字符串,其实没什么区别,只是不支持Inregrated Security。具体有什么差别,我也不知道,没有研究,网上挺多的。我也是搜索出来的。
二 ODAC
一看和ODBC很象啊,不过不是同一个东西。Oracle Data Access Components(ODAC)是一个提供原生的连接到Oracle的组件。他和OPD.NET有什么关系呢?实际OPD.NET只是ODAC的一部分。还包括了 Oracle Providers for ASP.NET, Oracle Provider for OLE DB 、 Oracle ODBC Driver、 Oracle SQL*Plus、 Oracle Instant Client以及 Oracle Developer Tools for Visual Studio。也就是说ODAC提供了用于WINDOWS访问ORACLE的一套组件,而不仅仅是.NET使用。
其中for ASP.NET主要是用于ASP.NET2.0版本开始提供的Member ship等功能,在安装完成ODAC后,如果需要这些功能,可以运行安装目录下ASP.NET文件夹中的SQL脚本(实际就是在数据库中建立相应的表)。Oracle Instant Client是oracle的客户端,因为和服务器通信是需要客户端的,关于客户端下面介绍。而 Oracle Developer Tools for Visual Studio是一个TOOL,安装后,你可以象SQL SERVER一样,在VS中连接了。
关于ODAC下载和详细信息:http://www.oracle.com/technology/global/cn/software/tech/windows/odpnet/index.html
目前最新的是Oracle 11g ODAC 11.1.0.7.20 ,可以连接9.2以上版本,大小为200M左右。
三 Oracle客户端
说到使用Oracle数据库,就不能不说Oracle客户端。Oracle是使用TCP/IP协议通信的。而客户端的功能就是负责和服务器通信。在Oracle11g以前,在安装完整的企业版时,可以选择是安装服务器还是客户端,但是在Oracle 11g中已经没有了,但是有单独的客户端下载。而ODAC中可以看到一个Oracle Instant Client,这个就是一个小型的客户端,其中包括了比较重要一个DLL,就是OCI.DLL,全名是Oracle Call InterFace
从上图可以看出,我们的程序都是通过OCI的API和Oracle进行通信的,OCI是一个应用程序接口,允许应用程序开发者使用一个第三代语言的原生过程或函数调用访问Oracle数据库服务器,并控制所有阶段的SQL语句执行。OCI是一个标准的数据库访问和索引功能库,以动态连接库的方式提供。 所以在如果没有Oracle客户端,OPD.NET也无法访问数据库,OPD.NET也只是把SQL发送给OCI,从OCI中取得数据。
如果我们下载了ODAC,那么一切都搞定了。因为她集成了最小客户端环境。只是缺少了一些网络配置工具和管理工具。其实在Oracle还提供Oracle Instant Client单独下载,大小只有40,50M,适合大批量部署客户端。不过需要手动的配置和修改注册表。对于开发来说,还是使用ODAC方便。如果系统中安装了其他版本的客户端,建议删除,我不清楚能否共存。不过还是删除比较好,免得发生奇怪的错误。
当然凡事都有例外,Oracle的Sql Developer就不需要安装客户端(11g已集成此工具),好像是通过java的thin直接连接服务器,JAVA我也不明白,这里就提一下,不过感觉还是没有PL/SQL好用,但是PL/SQL需要客户端。
最后就是系统的连接数据库的配置了,我们只用配置\oracle\product\11.1.0\client_1\Network\Admin下的tnsnames.ora文件。这里是设置服务器的监听信息。在Sample目录中有列子。写的很明白,这里就不介绍了。配置好以后,在PL/SQL或VS中的数据库或data source中可以看到并选择。而我们上面的Web.config中的配置的data source名也是我们这里设置的名字。这样就可以和服务器正常通信了。
四 ODBC
前面都是介绍的.net下使用Oracle的一些相关的东西,下面就看一下更深入的东西。其实我也不了解的很深,边学边卖吧!说到数据库连接,ODBC,OLEDB,ADO,ADO.NET是我们经常听说的东西。那么什么是ODBC呢?
上面是有关ODBC的一个结构图。一下是摘抄于Oracle的Odbc帮助文档
About Oracle ODBC Driver
Open Database Connectivity (ODBC) provides a standard interface that allows one application to access many different data sources. The application's source code does not have to be recompiled for each data source. A database driver links the application to a specific data source. A database driver is a dynamic-link library that an application can invoke on demand to gain access to a particular data source. Therefore, the application can access any data source for which a database driver exists.
ODBC也是一个数据访问的提供者,他允许一个程序可以访问不同的数据源,而不需要重新编译。其中数据库驱动成为了程序和数据源之间的桥梁,不同的驱动对应不同的数据源。只要提供了相应的驱动,程序就可以访问任何数据库。当应用程序改变它的 DBMS 时,开发人员只使用新的 DBMS 驱动程序替代旧的驱动程序,并且应用程序可以照常运行 ; 无需修改代码。从上图看,当一个程序要连接到一个数据源时,通过ODBC的API向驱动管理区发送请求,然后驱动管理器根据请求选择驱动,通过网络连接到数据库。
上图是一个详细的访问过程,我们可以看到Oracle的ODBC驱动是一个名为SQORA32的DLL文件,然后这个驱动调用OCI(前面介绍过了)来和服务器通信。我们在去看看系统中的ODBC数据源管理。可以看到,还有SQLSRV32.DLL、OBJECT32.DLL等文件,他们则是负责连接到SQL SERVER,ACCESS/EXCEL等数据源的驱动。另外一个文件是MSORCL32.DLL,这个是微软提供的访问oracle的驱动。
而DSN是Data Source Name,在我们安装完ODBC驱动之后,就需要配置DSN来使用ODBC,这里的配置就行设置一个驱动去访问那些数据源,TNS信息,以及一些比如连接超时,缓存大小等。在看看我们在.NET中使用ODBC时的链接字符串,其中就需要指定驱动,服务器,数据库已经用户和密码。如果配置了DNS,可以只指定DSN,而无需指定驱动。记得自己写的第一个程序,就是VB在ADO中使用DSN连接到了ACCESS。
view plaincopy to clipboardprint?
Driver={Sql Server};SERVER=MYSERVER;UID=sa;PWD=123;Database=northwind
Driver={Sql Server};SERVER=MYSERVER;UID=sa;PWD=123;Database=northwind
其他参考:http://www.hudong.com/wiki/ODBC
五 DA0和RDO
ODBC 使用低层接口,因此 C 和 C++ 程序员是真正从 ODBC 技术受益最多的人。Visual Basic (VB) 程序员没有一种简单的方法来访问 ODBC 接口。在 VB 6.0 之前,开发人员不得不依赖一种较高级别的数据访问模式。下图 显示了 VB 程序员如何用数据访问对象 (DAO) 访问数据库。
DAO 是建立在 Microsoft Jet Microsoft Access 的数据库引擎基础之上的。Jet 是第一个连接到 Access 的面向对象的接口。使用 Access 的应用程序可以用 DAO 直接访问数据库。由于 DAO 是严格按照 Access 建模的,因此,使用 DAO 是连接 Access 数据库最快速、最有效的方法。DAO 也可以连接到非 Access 数据库,例如,SQL Server 和 Oracle。DAO 使用 ODBC,但是由于 DAO 是专门设计用来与 Jet 引擎对话的,Jet 将解释 DAO 和 ODBC 之间的调用。使用除 Access 之外的数据库时,这种额外的解释步骤导致较慢的连接速度。
要克服这样的限制,Microsoft 创建了 RDO。图 3 显示了 RDO 如何直接访问 ODBC API,而无需通过 Jet 引擎。不久之后,Microsoft 推出了 ODBCDirect,它是 DAO 的扩展,在后台使用 RDO。图 4 显示 ODBCDirect 如何允许现有的 DAO 应用程序访问数据库,而没有 Jet 引擎产生的性能损失。
以上来自于微软的MSDN,可见,ODBC是一个底层的接口,对于VB等不直接和底层打交道的语言,要使用ODBC就需要有个中间件,DAO和RDO就充当了这样的角色。DAO是一个面向对象的接口,是的我们在VB中通过DAO对象来调用ODBC和数据库打交道。而VC中的MFC等也提供了对DAO的封装。所以作为程序员,只需要了解DAO,而无需了解ODBC,以及各数据库的区别,就能对多种数据库进行开发。而数据库JET引擎则负责吧DAO操作转换为对各种数据库的物理操作。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cc_net/archive/2009/10/28/4740054.aspx