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

    作者:课课家更新于: 2015-11-26 16:17:22

    大神带你学编程,欢迎选课

    获得知识的途径有很多,在课课家语言编程的学习更是有无限的乐趣,现在由小编为大家讲解有关语言编程的文章希望对大家有所帮助。
    总的来说,提高应用程序性能的最好的方法是发现应用的瓶径之所在,和进行交互的性能无疑是决定应用程序性能的重要环节之一。因为ADO是当前最新的基于组件的数据库编程的接口,这里我们主要讨论用ADO编程所需要注意的问题,因为ADO是一个和无关的COM组件系统,所以这里讨论的要点适用于所有的编程语言和编程环境,比如:、VBScript、VC、等等。
    显式的定义对象变量的类型:
    实际上,这条准则不仅适用于ADO编程,也适用于其他的COM对象相关的编程,因为如果一开始就定义变量类型的话,编译器在编译的时候就可以知道变量的类型,编译器实际上就采用vtable偏移的方式来得到具体的COM对象包含的方法的地址(这一点和C++中的虚函数的地址的获取类似),但如果一开始不指定变量类型的话,比如简单的采用如下的语句:
    DIM myCon as Object
    或者是
    DIM myCon
    那么编译器在编译的时候就不能得到变量的类型,而只能在运行的时候动态的得到方法的信息dreamweaver教程(通过使用接口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

    在网站维护中,站长朋友常常要对网站数据进行备份,以免出现意外情况而造成数据的损失。一般的下载备份方法不仅麻烦而且速度缓慢。这时我们就可以使用程序提供的文件压缩功能来快速进行网站数据的备份。
    首先将需要备份的网站文件前的复选框选中,然后点击“添加到压缩文件”超连接,接着在弹出的对话框中输入文件名称,注意一定要输入以zip为后缀的压缩文件格式。确定后稍等片刻,一个文件压缩包就制作完成了。只需要将其下载,放置在安全的地方保存就可以了。
    在管理器主页面的功能菜单中选择“上传文件”按钮,将在网页最下方打开文件上传模块(如图2),点击“浏览”按钮选择本地文件,然后再点击上传即可。程序中的文件容量栏目会自动显示该文件占用网站空间的大小,文件大小会以KB或Byte两种单位显示。我们可以根据此功能方便的对网站文件进行整理归类操作;点击下载超连接可以将网站文件下载到本地硬盘,操作方式与普通下载方式无异,还可以使用迅雷等下载工具进行文件的高速下载;软件还提供了功能强大的编辑器(如图3),点击编辑连接后会显示文件的源代码,它还提供了本地预览与在线预览的功能,使网站文件的调试工作变得非常简单高效;
    只查询你所需要的数据
    尽管很多开发人员都习惯采用"SELECT * FROM TBL"的模式进行查询,但是为了提高系统的效率,如果你只需要其中某几个字段的值的话,最好把这几个字段直接写出来,同时需要限定返回记录集的范围(通过WHERE子句进行限定)
    正确选择游标的位置、类型和锁方式
    如果你只需要按顺序读取记录并且不需要滚动和更新记录的话,axurerp7.0教程使用服务器端游标(adUseServer)、仅向前游标(adOpenForwardOnly)和读锁(adLockReadOnly)可以使你获得最好的性能。如果你需要滚动记录的话,采用客户端游标(adUseServer)会比采用服务器端游标所得到的性能要好,ADO系统默认是采用服务器端游标类型的。当然如果数据集合相当大的话,采用服务器端游标的性能会好一些。同时需要注意的话,如果采用客户端游标的话,最好只采用读加锁(adLockReadOnly)的锁类型,因为如果你需要更新数据的话,客户端游标引擎需要得到额外的信息(元数据),而这个信息的获取是非常昂贵的。
    调整记录集对象(Recordset)CacheSize的属性
    ADO使用记录集对象的CacheSize的属性来决定提取和缓存的记录的数目,当你在缓存的范围内浏览数据的话,ADO就只从缓存中提取数据。当你要浏览的数据超出缓存的范围的时候,ADO就释放缓存,提取下一些记录(提取的数目为CacheSize的大小)。你必须根据你具体的应用程序的情况来设定CacheSize的大小保证你得到最好的性能。
    自己定义command对象的参数
    在许多数据源中,得到参数信息和执行命令的代价几乎是一样的,所以如果可能的话,你要自己在程序中定义好command参数(也就是说要定义好参数的名称、类型和方向信息),而避免从数据提供者(Provider)那里获取信息.
    使用原始的OLE DB提供者
    MDAC对许多数据源提供了原始的数据提供者,比如和数据库,这样你不需要再通过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://批量更新数据

    需要注意的是,当你执行批量更新的话,axurerp7.0视频教程你必须自己处理数据冲突问题,因为当你更新数据的时候,其他人可能也正在对该数据进行操作。
    如果不需要返回记录的话,使用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驱动程序会为你做剩下的事情。
     

    看完小编的文章是不是很精彩,是不是想要成为编程语言的高手,更多关于在线教育的文章尽在课课家,希望你们多多关注。

课课家教育

未登录

1