论文部分内容阅读
【摘要】本文首先概述了应用程序层次结构的相关概念,然后分析了ObjectDataSource的主要功能,最后进行了SqlDataSource和ObjectDataSource在数据查询和删除时的性能对比试验,通过实验得出两个控件的性能对比,从而为研究人员和应用级的编程人员在项目中根据实际需要,选择最高效的控件时提供参考依据。
【关键词】SqlDataSource;ObjectDataSource;表示层;数据层;中间层
一、应用程序层次结构的相关概念
两层应用程序层次结构是指应用程序的表示层(如ASP.NET网页)可以与其数据层(如数据库、XML文件等)直接进行通信。大多数ASP.NET数据源控件都是两层应用程序层次结构,比如SqlDataSource,它的两层分别是表示层和数据层。两层应用程序层次结构本身有很多优点,使用也能方便,但是在企业级的应用中,实际常用的应用程序设计原则却需要将表示层与业务逻辑相分离,所以原有的两层应用程序层次结构在理解和设计上略显不足,于是出现了三层应用程序层次结构。
三层应用程序层次结构是指应用程序被分成了表示层、中间层(如封装业务逻辑的层)、数据层,三个层协同工作,来完成应用程序的功能,比如ObjectDataSource,它可用作数据控件(如GridView控件)的数据接口,允许以声明方式将数据绑定到由自定义业务对象公开的数据,以用于多层Web应用程序结构,这正是三层架构甚至N层架构所需要的。中间层是由于应用程序在设计的时候,业务逻辑常常不是封装在表示层中,而是将业务逻辑从表示层中分离出来,并将业务逻辑封装在业务对象中,于是这些业务对象在表示层和数据层之间形成一层,即形成了中间层,进而生成了一种三层应用程序结构[1]。
二、ObjectDataSource的主要功能
ObjectDataSource控件的主要作用是将表示层的数据控件绑定到中间层的业务对象,即通过提供一种将相关页上的数据控件绑定到中间层业务对象的方法,为三层应用程序结构提供支持。在不使用扩展代码的情况下,ObjectDataSource通过中间层业务对象以声明方式对数据执行插入、删除、更新、排序、选择、缓存、分页和筛选操作,这些操作ObjectDataSource是使用反射调用业务对象的方法实现的。
ObjectDataSource控件的主要功能可以概括如下:
1、ObjectDataSource在排序和分页时,是数据绑定控件(如GridView)将请求的排序和分页信息传递到ObjectData-Source的数据对象,然后由源数据对象或数据源控件对数据进行处理,并将处理结果返回到各数据绑定控件中。
2、如果基础业务对象返回的对象是存放资源或者能在多个请求之间保持共享状态,那么ObjectDataSource控件就可以缓存它。DataReader对象由于不符合上述条件,因而ObjectDataSource控件不能缓存DataReader对象。
3、如果想从ObjectDataSource控件的查询结果中再筛选一些数据,也就是只想得到与指定的搜索条件匹配的数据,但又不想使用新的选择条件对数据源进行重新查询,那么由源数据对象返回到ObjectDataSource的对象格式只能是DataSet或DataTable对象,筛选可以通过设置DataColumn类的Expression属性实现。
4、ObjectDataSource控件提供的四个属性:InsertMethod、UpdateMethod、DeleteMethod、SelectMethod用于执行数据插入、更新、删除和数据查询操作,这四个操作中的每一个操作都对应着一个参数集合以便对参数进行管理,它们分别是InsertParameters、UpdateParameters、DeleteParameters和SelectParameters集合,这些集合中的每个参数都可以为其指定名称、方向、类型和默认值,而且是在运行时接受输入参数。注意,在业务对象中创建方法时,必须确保所创建的方法中所接受的参数名和类型与ObjectDataSource传递的参数名和类型相一致。如果参数的值需要从控件、用户配置文件或Session变量等特定对象中获取,那就需要进行相应的属性设置,比如如果参数的值需要从控件中获取,那么需要设置ControlID属性以确定是从哪个控件获取值,以及设置PropertyName属性以确定包含参数值的属性。ObjectDataSource能为GridView等自动进行更新、插入和删除操作的数据控件自动创建参数。
5、ObjectDataSource可以通过SortParameterName属性为Select业务对象方法指定排序参数,包括GridView控件在内的有些数据控件可以自动向ObjectDataSource控件传递排序参数,此时这些数据控件通常会传递一个排序表达式,以确定要用于对结果进行排序的列。例如,GridView就是通过SortExpression属性指定排序列。排序表达式可指定一个以上的列;指定多个列时,列名以逗号分隔。若要指定按降序排序,可以在排序表达式的排序列名称后加上DESC修饰符。
6、ObjectDataSource支持数据分页,它有两个属性用于标识分页参数,这两个属性就是StartRowIndexParameterName和MaximumRowsParameterName,用于确定起始行和数据页中的行数。
7、ObjectDataSource中业务对象方法的所有参数类型默认都是Object类型,假如业务对象方法中包含不同类型的参数,则必须显式指定强类型参数。Object-DataSource中大多数业务对象方法的参数都用的是String和Int32类型,如果要使用的参数类型是复杂参数类型或者是用户自定义的参数类型,就可以使用Data-ObjectTypeName属性来完成。 8、使用ObjectDataSource可以在不更改公共接口的情况下更改类的实例数据。一般情况下,在业务对象中创建方法时,处理参数的传递方法有很多种,如果采用较长的参数列表将控件中的数据值一对一映射出来然后进行存储,这将导致代码失去可重用性。较好的参数的传递方法是在自定义类中进行数据封装,然后将自定义类的实例作为参数进行传递,这样处理的好处在于,更改类的实例数据时不需要更改数据源对象公开的公共接口,但是此时ObjectDataSource的参数需要以编程方式进行添加,然后对需要响应的事件进行处理,并在InputParameters集合中设置值。
9、如果要指定源对象的类,可以通过ObjectDataSource的TypeName属性来完成,源对象的类有多种选择,可以是Object-DataSource可以调用的被public修饰的static(或VB中的Shared)方法的任何类,也可以是任何ObjectDataSource能创建实例的类。源对象在数据源中执行查询等数据操作的依据是ObjectDataSource中对应的设置。创建包括ObjectDataSource在内的能处理中间层对象的数据组件可以使用Visual Studio 2008以上的版本中提供的创建向导,或者是自行创建自定义业务对象从而实现自定义的业务逻辑。
10、如果ObjectDataSource创建的源对象有实例方法,且该方法没有被static或Shared修饰,那么ObjectDataSource可以所有释放单个请求的实例资源。如果要对源对象的创建方式进行控制,可以使用ObjectCreating事件并通过Object-Instance设置实例,这样就可以不必在源对象中处理不带参数的公共构造函数,否则如果是通过创建其源对象的实例实现对其方法的调用,则该对象必须处理不带参数的公共构造函数,以免源对象创建新实例时没有对应的构造函数可用。
11、ObjectDataSource源对象中进行数据处理的方法在数量上是没有限制的,理论上可以是任意多个,调用方法时根据其方法名称和参数名称确定需要调用的方法比如SelectMethod,如果还想进一步获得数据源中对象的总数,可以选择使用SelectCount方法,强烈建议需要对象处理分页时使用此方法,因为这样可以大大降低数据查询时呈现数据的控件如GridView所必须请求的记录数,原因很简单,由于该方法提供了数据的总行数,因而对于每一页中的数据,呈现数据的控件如GridView仅需一次请求一页中的行就可以了,但如果没有提供数据的总行数,则呈现数据的控件必须请求数据源中的所有数据行,然后在请求完成后丢弃不在当前页中的那些数据行。
12、ObjectDataSource源对象可以向方法传递一个包含所有参数值的对象,而不用传递一个或多个参数,但这需要ObjectDataSource源对象返回或接收的强类型对象是用DataObjectTypeName属性标识过的。
13、利用ObjectDataSource控件的ConflictDetection属性可以进行数据更新的冲突检测,该属性确定UpdateMethod中指定的方法是否使用旧值和新值的参数,假定SelectMethod中指定的方法返回了DataTable控件,再假定该DataTable含有Name列和Number列,此时如果将ConflictDetection属性的的值设为OverwriteChanges,那么创建Update方法时使用的参数将为Name和Number,如果将ConflictDetection属性的值设为CompareAllValues,那么创建Update方法时使用的参数将为Name、Number、original_Name和original_Number,然后ObjectDataSource确定在UpdateMethod中指定的方法是否有匹配的参数。如果ConflictDetection属性设置为CompareAllValues,业务对象方法必须接受数据字段原始值的参数。当然也可以使用OldValuesParameterFormatString属性来区分当前值和原始值的参数,它的值通常被设置为一个字符串表达式,该表达式通常用{0}字符表示字段名,比如,如果将OldValuesParameterFormatString属性设为original_{0},假定有一个字段名为FirstName,那么此时它的原始值将由一个名为original_FirstName的参数传入,它的当前值将由一个名为FirstName的参数传入[2]。冲突检测时ObjectDataSource应该包括源数据对象更新前的原始值,此后,原始值就会放在开放式并发检查中。在开放式并发模型中,如果当某用户接收到来自数据库的值后,另一用户在该用户试图修改该值之前即将其修改,则认为发生了冲突。ObjectDataSource之所以这样处理数据更新的冲突,是因为开放式并发的用户在读取行时不会锁定该行,这样不但提高了性能节省了服务器资源,而且避免了与服务器的持长久连接。
14、如果在ObjectDataSource的冲突检测中将ConflictDetection的值设为CompareAllValues,并用OldValues-ParameterFormatString将一个参数的原值和最新值进行区分时,ObjectDataSource将会在包含参数原值的源对象中调用Delete方法,而在同时包含参数原值和最新值的源对象中调用Update方法。但在ObjectDataSource调用Delete并传递的是强类型对象时,此时如果ConflictDetection的值被设为OverwriteChanges,则给Delete传递的对象只包含主键的最新值,而对象的其他属性值均为null;而此时如果ConflictDetection的值被设为CompareAllValues,则给Delete传递的对象包含主键值和其他属性值,且这些值都是用原始值而不是最新值。 15、当使用ObjectDataSource进行数据操作时,如果需要在客户端输入区域性数据如日期,那么输入的数据格式必须与服务器中对应的格式一致,因为ObjectDataSource不会自动进行区域性数据的格式转换。
三、SqlDataSource和ObjectData-Source数据查询和删除的性能对比试验与分析
为了对ObjectDataSource和SqlData-Source控件的数据查询和删除的性能对比研究,我们设计和完成一个试验,让Obj-ectDataSource和SqlDataSource控件分别从数据库中查询和删除大批量的不同类型的数据,然后通过表示层的ASP.NET网页显示出来,进而根据它们在一次提交几十万条记录时的具体表现,比较两者的性能差距,并同时得出两者性能相同的临界值,即得出当一次提交的数据量达到多少时,能使两者的性能相等,这样在企业级应用中当一次提交的数据量大于临界值时,就应该使用性能更优的控件。然后根据实验数据,分析SqlDataSource控件和ObjectDataSource控件性能优劣性的形成原因。
1、实验特殊说明。实验数据分别采用了升序整型数据、降序整型数据、升序字符数据和降序字符数据,之所以考虑数据的升序和降序,是为了避免数据库中数据的存放顺序对实验结果的影响。同时,为了避免计算机的软硬件环境和网络状况等外部条件对实验结果的影响,试验采用在同一台计算机的平一操作系统平台上,同时安装数据库和.Net程序运行环境,试验采用了WINDOWS平台和SQL SERVER2008数据库,试验时关闭了试验机的一切外部程序。
2、实验结果。由于采用降序数据和升序数据的实验结果类似,所以这里只列出了一种数据类型降序数据的实验结果。实验结果如表1所示(时间单位为秒)。
3、实验结论。从实验结果看,在.NET平台和SQL SERVER2008数据库在同一台服务器上且当提交的数据条数在10万条时,SqlDataSource和ObjectDataSource的查询和删除时间几乎是相同的,甚至SqlDataSource还略有优势,但当数据条数超过30万条时,ObjectDataSource的优势开始体现出来,特别是当数据条数超过60万条时,ObjectDataSource查询操作的优势非常明显。尽管上述数据的误差难以避免,但不会影响实验结论的准确性。
4、数据分析。从实验数据看,当数据条数超过60万条时,ObjectDataSource查询操作体现的优势超出了预期,因为SqlDataSource是基于两层的,而且页面与数据库直接进行通信,业务逻辑不用单独封装,而且试验采用的又是WINDOWS平台,这种业务逻辑的处理方法会使数据类型对接和数据传递时有较大优势,然而实验结果却恰恰相反,究其原因,一是SqlDataSource控件封装时为了实现其强大的功能,难以避免地增加了开销,特别是本试验没有使用的一些功能,使得这些开销毫无意义,其中与数据类型和数据传递有关的多余开销还会随着数据量的增加而大幅增加,而ObjectDataSource业务逻辑封装在业务对象中,其业务逻辑的功能是根据实际需要订制的,所以基本不会出现多余的开销。二是SqlDataSource在运行时是自动连接数据库、执行SQL语句或存储过程、返回数据,然后自动关闭连接,这种自动操作在服务器负荷很大特别是数据量很大时,必然会受到影响,而ObjectDataSource连接数据库、执行SQL语句或存储过程后返回数据、关闭连接都是手工控制的,在服务器负荷很大或者数据量很大时,受到的影响不大。
综上所述,在当前一般配置的装有WINDOWS系统和SQL SERVER2008的服务器中,虽然SqlDataSource和ObjectDataSource都可以进行数据库的查询和删除操作,但是在基于性能选择使用它们的查询和删除时,应该根据访问数据量的大小和网络状况等因素进行选择,当数据条数超过30万条时,应该选择使用ObjectDataSource,因为此时它的性能更优,而且数据量越大优势越明显,但当数据条数在10万条时,选择那个都可以,此时如果代码量不大,可以使用SqlDataSource,但如果要对应用程序进行更准确地控制,应该使用ObjectDataSource,因为ObjectDataSource是将业务逻辑封装在业务对象中,控制上更加方便灵活。
参考文献
[1]周剑,徐德智.基于Web的三层应用程序设计[J].湘潭师范学院学报(自然科学版),2008(01).
[2]ObjectDataSource Web服务器控件概述http://msdn.microsoft.com/zh-cn/library/9a4kyhcx%28v=vs.100%29.aspx.
作者简介:刘仲博(1973—),男,1994年获得陕西师大数学系理学学士学位,1997年通过自考获得西北政法学院法律本科,2006年获得西安电子科技大学计算机科学与技术工学硕士学位,宁夏职业技术学院、宁夏广播电视大学系统管理员。
【关键词】SqlDataSource;ObjectDataSource;表示层;数据层;中间层
一、应用程序层次结构的相关概念
两层应用程序层次结构是指应用程序的表示层(如ASP.NET网页)可以与其数据层(如数据库、XML文件等)直接进行通信。大多数ASP.NET数据源控件都是两层应用程序层次结构,比如SqlDataSource,它的两层分别是表示层和数据层。两层应用程序层次结构本身有很多优点,使用也能方便,但是在企业级的应用中,实际常用的应用程序设计原则却需要将表示层与业务逻辑相分离,所以原有的两层应用程序层次结构在理解和设计上略显不足,于是出现了三层应用程序层次结构。
三层应用程序层次结构是指应用程序被分成了表示层、中间层(如封装业务逻辑的层)、数据层,三个层协同工作,来完成应用程序的功能,比如ObjectDataSource,它可用作数据控件(如GridView控件)的数据接口,允许以声明方式将数据绑定到由自定义业务对象公开的数据,以用于多层Web应用程序结构,这正是三层架构甚至N层架构所需要的。中间层是由于应用程序在设计的时候,业务逻辑常常不是封装在表示层中,而是将业务逻辑从表示层中分离出来,并将业务逻辑封装在业务对象中,于是这些业务对象在表示层和数据层之间形成一层,即形成了中间层,进而生成了一种三层应用程序结构[1]。
二、ObjectDataSource的主要功能
ObjectDataSource控件的主要作用是将表示层的数据控件绑定到中间层的业务对象,即通过提供一种将相关页上的数据控件绑定到中间层业务对象的方法,为三层应用程序结构提供支持。在不使用扩展代码的情况下,ObjectDataSource通过中间层业务对象以声明方式对数据执行插入、删除、更新、排序、选择、缓存、分页和筛选操作,这些操作ObjectDataSource是使用反射调用业务对象的方法实现的。
ObjectDataSource控件的主要功能可以概括如下:
1、ObjectDataSource在排序和分页时,是数据绑定控件(如GridView)将请求的排序和分页信息传递到ObjectData-Source的数据对象,然后由源数据对象或数据源控件对数据进行处理,并将处理结果返回到各数据绑定控件中。
2、如果基础业务对象返回的对象是存放资源或者能在多个请求之间保持共享状态,那么ObjectDataSource控件就可以缓存它。DataReader对象由于不符合上述条件,因而ObjectDataSource控件不能缓存DataReader对象。
3、如果想从ObjectDataSource控件的查询结果中再筛选一些数据,也就是只想得到与指定的搜索条件匹配的数据,但又不想使用新的选择条件对数据源进行重新查询,那么由源数据对象返回到ObjectDataSource的对象格式只能是DataSet或DataTable对象,筛选可以通过设置DataColumn类的Expression属性实现。
4、ObjectDataSource控件提供的四个属性:InsertMethod、UpdateMethod、DeleteMethod、SelectMethod用于执行数据插入、更新、删除和数据查询操作,这四个操作中的每一个操作都对应着一个参数集合以便对参数进行管理,它们分别是InsertParameters、UpdateParameters、DeleteParameters和SelectParameters集合,这些集合中的每个参数都可以为其指定名称、方向、类型和默认值,而且是在运行时接受输入参数。注意,在业务对象中创建方法时,必须确保所创建的方法中所接受的参数名和类型与ObjectDataSource传递的参数名和类型相一致。如果参数的值需要从控件、用户配置文件或Session变量等特定对象中获取,那就需要进行相应的属性设置,比如如果参数的值需要从控件中获取,那么需要设置ControlID属性以确定是从哪个控件获取值,以及设置PropertyName属性以确定包含参数值的属性。ObjectDataSource能为GridView等自动进行更新、插入和删除操作的数据控件自动创建参数。
5、ObjectDataSource可以通过SortParameterName属性为Select业务对象方法指定排序参数,包括GridView控件在内的有些数据控件可以自动向ObjectDataSource控件传递排序参数,此时这些数据控件通常会传递一个排序表达式,以确定要用于对结果进行排序的列。例如,GridView就是通过SortExpression属性指定排序列。排序表达式可指定一个以上的列;指定多个列时,列名以逗号分隔。若要指定按降序排序,可以在排序表达式的排序列名称后加上DESC修饰符。
6、ObjectDataSource支持数据分页,它有两个属性用于标识分页参数,这两个属性就是StartRowIndexParameterName和MaximumRowsParameterName,用于确定起始行和数据页中的行数。
7、ObjectDataSource中业务对象方法的所有参数类型默认都是Object类型,假如业务对象方法中包含不同类型的参数,则必须显式指定强类型参数。Object-DataSource中大多数业务对象方法的参数都用的是String和Int32类型,如果要使用的参数类型是复杂参数类型或者是用户自定义的参数类型,就可以使用Data-ObjectTypeName属性来完成。 8、使用ObjectDataSource可以在不更改公共接口的情况下更改类的实例数据。一般情况下,在业务对象中创建方法时,处理参数的传递方法有很多种,如果采用较长的参数列表将控件中的数据值一对一映射出来然后进行存储,这将导致代码失去可重用性。较好的参数的传递方法是在自定义类中进行数据封装,然后将自定义类的实例作为参数进行传递,这样处理的好处在于,更改类的实例数据时不需要更改数据源对象公开的公共接口,但是此时ObjectDataSource的参数需要以编程方式进行添加,然后对需要响应的事件进行处理,并在InputParameters集合中设置值。
9、如果要指定源对象的类,可以通过ObjectDataSource的TypeName属性来完成,源对象的类有多种选择,可以是Object-DataSource可以调用的被public修饰的static(或VB中的Shared)方法的任何类,也可以是任何ObjectDataSource能创建实例的类。源对象在数据源中执行查询等数据操作的依据是ObjectDataSource中对应的设置。创建包括ObjectDataSource在内的能处理中间层对象的数据组件可以使用Visual Studio 2008以上的版本中提供的创建向导,或者是自行创建自定义业务对象从而实现自定义的业务逻辑。
10、如果ObjectDataSource创建的源对象有实例方法,且该方法没有被static或Shared修饰,那么ObjectDataSource可以所有释放单个请求的实例资源。如果要对源对象的创建方式进行控制,可以使用ObjectCreating事件并通过Object-Instance设置实例,这样就可以不必在源对象中处理不带参数的公共构造函数,否则如果是通过创建其源对象的实例实现对其方法的调用,则该对象必须处理不带参数的公共构造函数,以免源对象创建新实例时没有对应的构造函数可用。
11、ObjectDataSource源对象中进行数据处理的方法在数量上是没有限制的,理论上可以是任意多个,调用方法时根据其方法名称和参数名称确定需要调用的方法比如SelectMethod,如果还想进一步获得数据源中对象的总数,可以选择使用SelectCount方法,强烈建议需要对象处理分页时使用此方法,因为这样可以大大降低数据查询时呈现数据的控件如GridView所必须请求的记录数,原因很简单,由于该方法提供了数据的总行数,因而对于每一页中的数据,呈现数据的控件如GridView仅需一次请求一页中的行就可以了,但如果没有提供数据的总行数,则呈现数据的控件必须请求数据源中的所有数据行,然后在请求完成后丢弃不在当前页中的那些数据行。
12、ObjectDataSource源对象可以向方法传递一个包含所有参数值的对象,而不用传递一个或多个参数,但这需要ObjectDataSource源对象返回或接收的强类型对象是用DataObjectTypeName属性标识过的。
13、利用ObjectDataSource控件的ConflictDetection属性可以进行数据更新的冲突检测,该属性确定UpdateMethod中指定的方法是否使用旧值和新值的参数,假定SelectMethod中指定的方法返回了DataTable控件,再假定该DataTable含有Name列和Number列,此时如果将ConflictDetection属性的的值设为OverwriteChanges,那么创建Update方法时使用的参数将为Name和Number,如果将ConflictDetection属性的值设为CompareAllValues,那么创建Update方法时使用的参数将为Name、Number、original_Name和original_Number,然后ObjectDataSource确定在UpdateMethod中指定的方法是否有匹配的参数。如果ConflictDetection属性设置为CompareAllValues,业务对象方法必须接受数据字段原始值的参数。当然也可以使用OldValuesParameterFormatString属性来区分当前值和原始值的参数,它的值通常被设置为一个字符串表达式,该表达式通常用{0}字符表示字段名,比如,如果将OldValuesParameterFormatString属性设为original_{0},假定有一个字段名为FirstName,那么此时它的原始值将由一个名为original_FirstName的参数传入,它的当前值将由一个名为FirstName的参数传入[2]。冲突检测时ObjectDataSource应该包括源数据对象更新前的原始值,此后,原始值就会放在开放式并发检查中。在开放式并发模型中,如果当某用户接收到来自数据库的值后,另一用户在该用户试图修改该值之前即将其修改,则认为发生了冲突。ObjectDataSource之所以这样处理数据更新的冲突,是因为开放式并发的用户在读取行时不会锁定该行,这样不但提高了性能节省了服务器资源,而且避免了与服务器的持长久连接。
14、如果在ObjectDataSource的冲突检测中将ConflictDetection的值设为CompareAllValues,并用OldValues-ParameterFormatString将一个参数的原值和最新值进行区分时,ObjectDataSource将会在包含参数原值的源对象中调用Delete方法,而在同时包含参数原值和最新值的源对象中调用Update方法。但在ObjectDataSource调用Delete并传递的是强类型对象时,此时如果ConflictDetection的值被设为OverwriteChanges,则给Delete传递的对象只包含主键的最新值,而对象的其他属性值均为null;而此时如果ConflictDetection的值被设为CompareAllValues,则给Delete传递的对象包含主键值和其他属性值,且这些值都是用原始值而不是最新值。 15、当使用ObjectDataSource进行数据操作时,如果需要在客户端输入区域性数据如日期,那么输入的数据格式必须与服务器中对应的格式一致,因为ObjectDataSource不会自动进行区域性数据的格式转换。
三、SqlDataSource和ObjectData-Source数据查询和删除的性能对比试验与分析
为了对ObjectDataSource和SqlData-Source控件的数据查询和删除的性能对比研究,我们设计和完成一个试验,让Obj-ectDataSource和SqlDataSource控件分别从数据库中查询和删除大批量的不同类型的数据,然后通过表示层的ASP.NET网页显示出来,进而根据它们在一次提交几十万条记录时的具体表现,比较两者的性能差距,并同时得出两者性能相同的临界值,即得出当一次提交的数据量达到多少时,能使两者的性能相等,这样在企业级应用中当一次提交的数据量大于临界值时,就应该使用性能更优的控件。然后根据实验数据,分析SqlDataSource控件和ObjectDataSource控件性能优劣性的形成原因。
1、实验特殊说明。实验数据分别采用了升序整型数据、降序整型数据、升序字符数据和降序字符数据,之所以考虑数据的升序和降序,是为了避免数据库中数据的存放顺序对实验结果的影响。同时,为了避免计算机的软硬件环境和网络状况等外部条件对实验结果的影响,试验采用在同一台计算机的平一操作系统平台上,同时安装数据库和.Net程序运行环境,试验采用了WINDOWS平台和SQL SERVER2008数据库,试验时关闭了试验机的一切外部程序。
2、实验结果。由于采用降序数据和升序数据的实验结果类似,所以这里只列出了一种数据类型降序数据的实验结果。实验结果如表1所示(时间单位为秒)。
3、实验结论。从实验结果看,在.NET平台和SQL SERVER2008数据库在同一台服务器上且当提交的数据条数在10万条时,SqlDataSource和ObjectDataSource的查询和删除时间几乎是相同的,甚至SqlDataSource还略有优势,但当数据条数超过30万条时,ObjectDataSource的优势开始体现出来,特别是当数据条数超过60万条时,ObjectDataSource查询操作的优势非常明显。尽管上述数据的误差难以避免,但不会影响实验结论的准确性。
4、数据分析。从实验数据看,当数据条数超过60万条时,ObjectDataSource查询操作体现的优势超出了预期,因为SqlDataSource是基于两层的,而且页面与数据库直接进行通信,业务逻辑不用单独封装,而且试验采用的又是WINDOWS平台,这种业务逻辑的处理方法会使数据类型对接和数据传递时有较大优势,然而实验结果却恰恰相反,究其原因,一是SqlDataSource控件封装时为了实现其强大的功能,难以避免地增加了开销,特别是本试验没有使用的一些功能,使得这些开销毫无意义,其中与数据类型和数据传递有关的多余开销还会随着数据量的增加而大幅增加,而ObjectDataSource业务逻辑封装在业务对象中,其业务逻辑的功能是根据实际需要订制的,所以基本不会出现多余的开销。二是SqlDataSource在运行时是自动连接数据库、执行SQL语句或存储过程、返回数据,然后自动关闭连接,这种自动操作在服务器负荷很大特别是数据量很大时,必然会受到影响,而ObjectDataSource连接数据库、执行SQL语句或存储过程后返回数据、关闭连接都是手工控制的,在服务器负荷很大或者数据量很大时,受到的影响不大。
综上所述,在当前一般配置的装有WINDOWS系统和SQL SERVER2008的服务器中,虽然SqlDataSource和ObjectDataSource都可以进行数据库的查询和删除操作,但是在基于性能选择使用它们的查询和删除时,应该根据访问数据量的大小和网络状况等因素进行选择,当数据条数超过30万条时,应该选择使用ObjectDataSource,因为此时它的性能更优,而且数据量越大优势越明显,但当数据条数在10万条时,选择那个都可以,此时如果代码量不大,可以使用SqlDataSource,但如果要对应用程序进行更准确地控制,应该使用ObjectDataSource,因为ObjectDataSource是将业务逻辑封装在业务对象中,控制上更加方便灵活。
参考文献
[1]周剑,徐德智.基于Web的三层应用程序设计[J].湘潭师范学院学报(自然科学版),2008(01).
[2]ObjectDataSource Web服务器控件概述http://msdn.microsoft.com/zh-cn/library/9a4kyhcx%28v=vs.100%29.aspx.
作者简介:刘仲博(1973—),男,1994年获得陕西师大数学系理学学士学位,1997年通过自考获得西北政法学院法律本科,2006年获得西安电子科技大学计算机科学与技术工学硕士学位,宁夏职业技术学院、宁夏广播电视大学系统管理员。