开店乐

开店乐电子商务研究 KaiDianLe.Com

网站地图 :

  搜索:

数据库应用程序需注意的问题

    总的来说,提高应用程序性能的最好的方法是发现应用的瓶径之所在,和数据库进行交互的性能无疑是决定应用程序性能的重要环节之一。因为ADO是当前最新的基于组件的数据库编程的接口,这里我们主要讨论用ADO编程所需要注意的问题,因为ADO是一个和编程语言无关的COM组件系统,所以这里讨论的要点适用于所有的编程语言和编程环境,比如:VB、VBScript、VC、Java等等。

  显式的定义对象变量的类型:【来源:开店乐KaiDianLe.Com

  实际上,这条准则不仅适用于ADO编程,也适用于其他的COM对象相关的编程,因为如果一开始就定义变量类型的话,编译器在编译的时候就可以知道变量的类型,编译器实际上就采用vtable偏移的方式来得到具体的COM对象包含的方法的地址(这一点和C++中的虚函数的地址的获取类似),但如果一开始不指定变量类型的话,比如简单的采用如下的语句:

  DIM myCon as Object

   或者是

  DIM myCon

那么编译器在编译的时候就不能得到变量的类型,而只能在运行的时候动态的得到方法的信息(通过使用接口IDispatch的方法Invoke来实现的),这样为了得到方法的地址和相关的变量情况就需要在内部进行两次调用,无疑就使速度降低。

  当浏览记录的时候,绑定列到具体的字段对象上去

  这个意思就是说在一开始的时候我们就建立对字段对象的引用,避免在每次得到记录的时候需要在Rcordset::Fields中进行查找而增加系统的开销。

  比如可以采用如下的示例代码形式:

  Private Sub TblBrowse_Click()

   Dim fld1 As ADODB.Field

   Dim fld2 As ADODB.Field

   Dim rs As ADODB.Recordset

   set rs=g_cn.execute(...) 'g_cn为全局adodb.connection对象

   Set fld1 = rs.Fields("id") '数据表的字段

   Set fld2 = rs.Fields("name") '数据表的字段
   If rs.BOF = False Then

    While rs.BOF = False

     Debug.Print fld1.Value

     Debug.Print fld2.Value

     rs.MoveNext

    Wend

   End If

   rs.Close

  End Sub

  尽量采用SQL语句和存储过程进行数据更新

  尽管采用Recordset对象来更新数据是非常方便的,但是它的开销也更大,所以如果可能的话,就要采用SQL语句来更新数据。使用存储过程而不是单一的SQL语句来获取信息。因为存储过程是在服务器端执行的,只把结果返回到客户端,这样一方面可以降低网络进行数据交互的开销,另一方面使系统更加容易维护,并且保持数据的一致性。而如果使用recordset来得到结果的话,通过数据源对象返回的查询集不仅包含了数据,而且也包含了元数据(metadata),在有些时候元数据可能比数据本身还要大,这样系统的开销无疑也增加了不少。

  如果必须要使用游标的话,最好使用集合的方法对单条的SELECT语句进行操作

Recordset::get_Collect和Recordset::put_Collect方法是Recordset 对象的快捷方式,可以使你快速的得到一个字段的值而不需要获得关于一个字段的引用。可以参考如下的示例代码:

  Sub Collect()

   Dim rs As New Recordset

   rs.ActiveConnection = "…"

   rs.Source = "一条SQL查询语句"

   rs.Open

   Debug.Print rs.Collect(0), rs.Collect(1), rs.Collect(2)

   Debug.Print rs!au_id, rs!au_fname, rs!au_lname

  End Sub


  只查询你所需要的数据

  尽管很多开发人员都习惯采用"SELECT * FROM TBL"的模式进行查询,但是为了提高系统的效率,如果你只需要其中某几个字段的值的话,最好把这几个字段直接写出来,同时需要限定返回记录集的范围(通过WHERE子句进行限定)

  正确选择游标的位置、类型和锁方式

  如果你只需要按顺序读取记录并且不需要滚动和更新记录的话,使用服务器端游标(adUseServer)、仅向前游标(adOpenForwardOnly)和读锁(adLockReadOnly)可以使你获得最好的性能。如果你需要滚动记录的话,采用客户端游标(adUseServer)会比采用服务器端游标所得到的性能要好,ADO系统默认是采用服务器端游标类型的。当然如果数据集合相当大的话,采用服务器端游标的性能会好一些。同时需要注意的话,如果采用客户端游标的话,最好只采用读加锁(adLockReadOnly)的锁类型,因为如果你需要更新数据的话,客户端游标引擎需要得到额外的信息(元数据),而这个信息的获取是非常昂贵的。

  调整记录集对象(Recordset)CacheSize的属性

  ADO使用记录集对象的CacheSize的属性来决定提取和缓存的记录的数目,当你在缓存的范围内浏览数据的话,ADO就只从缓存中提取数据。当你要浏览的数据超出缓存的范围的时候,ADO就释放缓存,提取下一些记录(提取的数目为CacheSize的大小)。你必须根据你具体的应用程序的情况来设定CacheSize的大小保证你得到最好的性能。

  自己定义command对象的参数

  在许多数据源中,得到参数信息和执行命令的代价几乎是一样的,所以如果可能的话,你要自己在程序中定义好command参数(也就是说要定义好参数的名称、类型和方向信息),而避免从数据提供者(Provider)那里获取信息.

  使用原始的OLE DB提供者

  MDAC对许多数据源提供了原始的数据提供者,比如SQL Server,Oracle和ACCESS数据库,这样你不需要再通过ODBC来获取数据(也就是说不需要再通过ODBC驱动这一层),这样的好处是你能更快的得到数据,并且降低磁盘和内存的开销。

  如果使用客户端游标的话,断开connection连接

  ADO有一个特征是当使用客户端游标操作Recordset记录集的时候,不需要和服务器进行联系。你可以充分利用这个特征降低服务器端的开销(服务器就不需要维护这些连接了),当你操作完记录集需要更新的话,可以重新和数据库进行连接来更新数据。为了创建一个可以断开连接的记录集,你同时也需要使用静态游标(adOpenStatic)和批处理的加锁模式(adLockBatchOptimistic)。下面的示例是用VC写的:

……

  pRs.CreateInstance(__uuid(Recordset));

  pRs->CursorLoction=adUseClient;

  pRs->Open(strCmdText,strConnection,adOpenStatic,adLockBatchOptimistic,adCmdText);

  pRs->PutRefActiveConnection(NULL);

  file://这里可以对记录集对象pRs进行操作

  pRs->PutRefAxctiveConnection(pCon); file://重新和数据库建立连接

  pRs->UpdateBatch(adAffectAll); file://批量更新数据

需要注意的是,当你执行批量更新的话,你必须自己处理数据冲突问题,因为当你更新数据的时候,其他人可能也正在对该数据进行操作。

  如果不需要返回记录的话,使用adExecuteNoRecords选项

  ADO 2.0包括一个新的执行选项称为adExecuteNoRecords,当使用该选项的时候,ADO就不会创建记录集对象,不设置任何游标属性。数据提供者因为不需要认证行集合的属性而使性能得到优化。具体的例子如下:

  con.Execute "insert into tbl values(fv1, fv2) ", , adExecuteNoRecords

对仅有一条的执行语句采用Connection::Execute的方法比使用Recordset::Open或者是Command::Execute的效果要好,因为ADO不保留任何命令状态的信息,因此执行性能就有所改进。

  使用session/connection缓冲池

  我们知道,数据库的打开和关闭是很消耗系统资源的。因此,连接池对基于多层的应用的性能有很大的提高,当你使用MDAC的时候,开发人员本身并不需要考虑对数据库连接的缓存,MDAC会自动处理它。连接池在两个层次上提供支持,OLE DB sessions和ODBC连接。如果你使用ADO的话,你的数据库连接会自动被OLE DB session缓冲池所缓存。如果使用ODBC的话,在ODBC数据源管理中新的连接缓冲池选项可以让你对ODBC缓冲进行设置,然后ODBC驱动程序会为你做剩下的事情。

【日期:2006-8-7】【作者:不祥】【转载自:开店乐】

相关文章:
 最好的网上开店系统:凡人网络购物系统免费下载
 SQL Server存储过程编写和优化措施
 SQL Server日志文件丢失的恢复方法
 SQL Server2000数据库系统表的应用
 品味SQL Server 2005的几个新功能
 SQL Server2000 索引结构及其使用
 SQL Server 中的几个函数要记录
 用SQL存储过程实现批量插入数据
 获取SQL Server服务器的当前连接数
 记存储过程中经常用到的本周\本月\本年函数
 数据库安全--应用IDS保卫数据库
 远程连接SQL Server服务器的解决方案
 SQL Server数据库定时自动备份
 升级到SQLServer2005的10大理由
 攻破SQL服务器的十种方法
 SQL Server安全规划全攻略
 SQL Server 服务器安装剖析
 大型数据库的SQL查询优化技巧
 优化SQL Server服务器内存配置的策略
 SQL服务器外网IP测试故障解决
 SQL SERVER 2000 SP4新特性概述
 Access与Sql Server之ASP代码比较
 通过作业定时同步服务器上的数据
 比较两个数据库的表结构差异
 不破坏原加密存储的存储解密
 优化--让你的SQL运行速度明显提高
 SQL Server数据库的备份与恢复
 数据库学习:查询区分大小写
 查询指定的表在那些数据库中存在
 Web环境下SQL中数据的磁带备份与恢复
 SQL Server里函数的两种用法
 SQL语法参考手册
 SQL数据库的六种数据移动方法
 Access转换成为SQL Server
 数据变换和转换注意事项(SQL)
 SQL语句性能调整原则
 SQL实现从数据库中随机抽N条记录
 怎样能限制SQL Server只能让指定的机器连接
 SQL存储过程入门与提高
 SQL Server端口更改后的数据库连接方式
 怎样设置SQL Server的用户及权限
 关于SQL语句查询分页数据的解决方案
 关于sql数据库维护失败的问题查找方法
 SQL Server与Excel数据互导
 减少动态SQL语句的预编译时间
 一个完整的SQL SERVER数据库全文索引的示例
 如何让你的SQL运行得更快
 MS-SQL server数据库开发精典技巧
 MSSQL按分页返回查询结果的存储过程
 MySQL 4.1.0 中文参考手册[连载]
 数据库访问技术
 SQL语言快速入门
 JDBC驱动程序的类型
 Microsoft的MSDN里面对ODBC的介绍
 JDBC1.2中几个最重要的接口和类
 SQL7.0储存过程调试
 UDA技术综述
 SQL Server的存储过程调用Com组件
 通过HTTP访问SQL Server 2000
 数据库应用程序需注意的问题
 SQL Server安全性简介
 用COM自动服务扩展SQL Server功能
 全面接触SQL语法
 SQL Server 2005数据库升级要点和技巧
 多条件数据库查询的优化方法
 如何解决SQL Server服务器耗尽内存的情况
 SQL Server的空值处理策略
 利用数据库日志恢复数据到时间点的操作
 得出SQL语句的执行时间的方法
 SQL Server2000数据库文件损坏时如何恢复
 在SQL Server 2000里设置和使用数据库复制
 修改系统密码后SQL服务器无法启动解决
 远程检测MS SQL Server账号安全性
 基于角色的方式管理SQL Server安全
 针对MS SQL SERVER的安全防御方案
 SQL Server补丁安装常见问题
 保护SQL Server:为安全性而安装
 SQL Server数据库安全规划全攻略
 SQL Server 2000 客户端实用程序小技巧
 SQL Server到Oracle连接服务器的实现
 把Access数据库移植到SQL
 避免Access和SQL Server的空值冲突
 用SQL Server保持会话状态
 两个SQL Server维护技巧
 Sql Server全文搜索中文出错的问题
 SQL Server备份的三个恢复模型
 利用BCP恢复SQL Server 2000数据库
 常用SQL字符串函数问题集锦
 SQL语句--如何替换字符串中的个别字符?
 MSSQL Ntext中的字段替换处理存储过程
 SQL中将一列数据分成三列来显示的方法
 SQL SERVER中替换text,ntext列中的字符串
 SQL存储过程来建立自动备份数据库
 Microsoft SQL Server 数据库维护计划
 两台Sql Server数据同步解决方案
 用SHA1或MD5 对用户身份验证的简单实现
 SQL Server开发的二十一条军规
 一个四用户信息同步更新的存储过程
 SQL Server中如何计算农历
 SQL Server安全设置清单列表
 SQL Server存储过程入门与提高

版权所有:Kaidianle.Com  联系方式:Shnxn@Yhaoo.Com.Cn 京ICP备06028743号 在线留言