热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

数据访问-与数据库建立连接_MySQL

在第一部分,我们讨论了如何优化ASP代码。在这一部分,我们把重点放在数据访问上。一般情况下,数据访问时间要比ASP代码解释,编译时间长,不要让数据检索成为影响ASP性能的瓶颈。首先,讲一些老生常谈的话。比如:需要声明变量,要用Response.WriteSQL_strin
在第一部分,我们讨论了如何优化 ASP 代码。在这一部分,我们把重点放在数据访问上。

一般情况下,数据访问时间要比 ASP 代码解释,编译时间长,不要让数据检索成为影响 ASP 性能的瓶颈。

首先,讲一些老生常谈的话。比如:需要声明变量,要用 Response.Write SQL_string 来进行调试,要用 On Error Resume
Next 来捕获错误。不要在 Application 和 Session 中存储 Connection 对象等等,都是一些很多人知道而又不屑一顾的常
识。

提高数据访问速度包含两方面内容:1 与数据库建立连接。2 检索数据。

建立高效的连接是优化数据库访问的第一步。你需要了解连接池的概念( 参见文章: 连接池(Connection Pooling)介绍 );了解
连接数据库的方法。另外,测试是很重要的,如果你想亲自进行测试,可以下载上一部分提到的 WAST ,它可以模拟大量用户同时
点击的情况。在这里,假设你使用的数据库是 MS SQL Server 7.0 ,如果 操作系统是 NT ,那么你可以在性能监视器中监测
SQL7 的用户连接数(counter:User Connections);如果操作系统是98的话,可以使用 SQL7 的 Profiler。

下面,开始讨论如何与数据库建立连接,以及连接池的问题。

1. 使用 OLEDB

与数据库建立连接有三种方法:DSN,DSN-less,OLEDB( 参见文章: 用ADO连接数据库的三种方法 )。建议使用 OLEDB。

2. 尽快释放数据库对象

假设有 page1.asp 和 page2.asp,在多人同时点击的情况下,服务器可能会这样工作:

第一个人:page1.asp 的1-5行,
第二个人:page1.asp 的1-5行,
第一个人:page1.asp 的6-20行,
第二个人:page1.asp 的1-5行,
第三个人:page1.asp 的1-5行,
第四个人:page1.asp 的1-5行,
第二个人:page1.asp 的6-20行,
第一个人:page2.asp 的1-5行,
......

设想一下:有几千人同时访问你的主页,那么,服务器就会执行数千行,数万行语句后才回到第一个人请求的页面上。因此,我们
应尽可能快的处理某个功能,某个任务。看下列代码:

<%
rs1.Open strSQL1,cnn1 'cnn1 is connection object
rs2.Open strSQL2,cnn2
rs3.Open strSQL3,cnn3
......
'处理 rs1
'处理 rs2
'处理 rs3
......
rs1.Close
rs2.Close
rs3.Close
cnn1.Close
cnn2.Close
cnn3.Close
%>

这种处理结果集的方法会占用比你想象要多的资源,正确的用法应为:

<%
rs1.Open strSQL1,cnn 'cnn is connection object
'处理 rs1
rs1.Close
cnn1.Close
......
rs2.Open strSQL2,cnn
'处理 rs2
rs2.Close
cnn2.Close
......
rs3.Open strSQL3,cnn
'处理 rs3
rs3.Close
cnn3.Close

......
%>

或许你会说:在 rs2 的处理中,我还需要 rs1 的值,所以不能在处理 rs2 前关闭 rs1。那么解决这个问题更好的办法是采用
GetRows 和 GetString,在后面会有详细的说明。

尽快的释放对象是保证数据库连接重用的前提。( 参见文章: 让数据库的连接更有效 )

3. 创建 Connection 对象,充分利用连接池。

看下列代码:

'创建 Connection Object,打开 RecordSet
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strConnection
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.Open strSQL,cnn

'直接打开 RecordSet
Set rs = Server.CreateObject("ADODB.RecordSet")
rs.open strSQL,strConnection

在 asptoday 的 Enhancing Performance in ASP - Part 2 中对这两种方法进行了测试,结果表明直接打开 RecordSet 比创
建 Connection 快23%(快在页面处理上,检索数据库的速度是一样的。)所以,这篇文章的结论是:When working with a
single Recordset,pass the connection string into the ActiveConenction property.

我对此有异议:快的代码不一定是好的代码。

首先要说明的是,直接打开 RecordSet 的方法依然要创建与数据库的连接,只不过是由 ADO 自动完成的。其次,这个
Connection 只有在该页面处理完后才能被释放(不管是 Recordset.Close 还是 Set recordset = Nothing 都不能做到释放该
对象)。

Dim rs
Dim strcnn
strcnn = "Driver={SQL Server};Server=.;Database=pubs;UID=sa;PWD=;OLE DB Services=-1;"
For i = 1 To 20
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM Authors",strcnn
rs.Close
Set rs = Nothing
Next


运行上面的代码,在性能监视器中你会发现数据库的连接被创建了20个!

Dim cnn,rs
strcnn = "Driver={SQL Server};Server=.;Database=pubs;" &_
"UID=sa;PWD=;OLE DB Services=-1;"
For i = 1 To 20
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strcnn
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM Authors",cnn
rs.Close
Set rs = Nothing
cnn.Close
Set cnn = Nothing
Next

采用上面的代码,连接数只需要2个!(只为说明问题,不考虑速度)

还有一点要说明的是:服务器处理 ASP 时不是一次只处理一个,也不是一次就把整个页面处理完,没有关闭的连接只会占用更多
的资源。所以,尽快的释放 Connection ,使它回到连接池中才是良好的编程习惯。连接池是服务器共享的资源,它不属于某个
ASP,也不属于某个 Session,或者某个 Application。

WAST 是我常用的测试工具,但是测试是一种手段,代替不了实际。如果你对 WAST 的工作方式感兴趣,可以到它的主页去看看。
http://webtool.rte.microsoft.com/

4. 为多个 RecordSet创建一个 Connection 对象

Dim cnn,rs1,rs2,r3
strcnn = "Driver={SQL Server};Server=.;Database=pubs;UID=sa;PWD=;OLE DB Services=-1;"
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open strcnn
Set rs1 = Server.CreateObject("ADODB.Recordset")
rs1.Open "SELECT * FROM Authors1",cnn
Set rs2 = Server.CreateObject("ADODB.Recordset")
rs2.Open "SELECT * FROM Authors2",cnn
Set rs3 = Server.CreateObject("ADODB.Recordset")
rs3.Open "SELECT * FROM Authors3",cnn
.....

道理很简单,这种做法不需要为每一个 RecordSet 创建一个连接,只要传递一个引用就够了。

5. 与多个数据库连接的问题。

在大部份应用中,我们只对一个数据库进行操作,但有时也会碰到与多个数据库连接的情况。下面我们讨论两种连接方式:

'第一种:两个 Connection,两个 RecordSet。
Set cnn1 = Server.CreateObject("ADODB.Connection")
Set cnn2 = Server.CreateObject("ADODB.Connection")
cnn1.Open "provider=sqloledb;data source=210.75.56.37;initial catalog=pubs;user
id=coolbel;password=coolbel.com;"
cnn2.Open "provider=sqloledb;data source=210.75.56.37;initial catalog=coolbel;user
id=coolbel;password=coolbel.com;"
Set rs1 = Server.CreateObject("ADODB.RecordSet")
Set rs2 = Server.CreateObject("ADODB.RecordSet")
rs1.Open "select * from authors",cnn1
rs2.Open "select * from mytable",cnn2
......

'第二种:一个 Connection,两个 RecordSet。
Set cnn = Server.CreateObject("ADODB.Connection")
cnn.Open "provider=sqloledb;data source=210.75.56.37;user id=coolbel;password=coolbel.com;"
Set rs1 = Server.CreateObject("ADODB.RecordSet")
Set rs2 = Server.CreateObject("ADODB.RecordSet")
rs1.Open "select * from pubs..authors",cnn
rs2.Open "select * from coolbel..mytable",cnn
......


第二种方法极不可取,不仅速度低,而且浪费资源。其效率低下的根本原因在于这种连接方式没有利用连接池,使得每一次请求都
要重新创建与数据库的连接。

Click!测试第一种代码 Click!测试第二种代码 ( coolbel 不稳定,需要多测试几遍。)

6. 对于 Disconnected RecordSet,不要忘记使 ActiveCOnnection= Nothing
推荐阅读
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文介绍了如何在具备多个IP地址的FTP服务器环境中,通过动态地址端口复用和地址转换技术优化网络配置。重点讨论了2Mb/s DDN专线连接、Cisco 2611路由器及内部网络地址规划。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 创建第一个 MUI 移动应用项目
    本文将详细介绍如何使用 HBuilder 创建并运行一个基于 MUI 框架的移动应用项目。我们将逐步引导您完成项目的搭建、代码编写以及真机调试,帮助您快速入门移动应用开发。 ... [详细]
  • 梦幻西游挖图奇遇:70级项链意外触发晶清诀,3000W轻松到手
    在梦幻西游中,挖图是一项备受欢迎的活动,无论是小宝图还是高级藏宝图,都吸引了大量玩家参与。通常情况下,小宝图的数量保证了稳定的收益,但特技装备的出现往往能带来意想不到的惊喜。本文讲述了一位玩家通过挖图获得70级晶清项链的故事,最终实现了3000W的游戏币逆袭。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
author-avatar
慌瓜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有