2

我有一个类似于下面的代码片段,我想将其重构为两个不同的函数,每个函数都有自己的连接(为了更好的维护):

Dim Conn, Sql, RS

Set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open ConnString

Sql = SELECT * FROM CLIENTS

Set RS = Conn.Execute(sql)
//'Do something with Clients

Set RS = Nothing

Sql = SELECT * FROM DEALERS

Set RS = Conn.Execute(sql)
//'Do something with Dealers

Set RS = Nothing

Conn.Close
Set Conn = Nothing

是否有两个函数(例如 GetClients 和 GetDealers)分别打开和关闭自己的连接会对性能造成重大影响,相反只打开和关闭单个连接,如上图所示?如果是这样,您将如何重构代码?

4

6 回答 6

5

如果我没记错的话,连接是池化的,因此打开和关闭每个函数的连接几乎不需要任何成本。

于 2009-06-03T20:45:50.470 回答
1
  1. 不要使用 select * 但指定您需要的列。
  2. 使用 getrows
  3. 指定您希望从数据库中获得的内容(使用连接和 where 子句)。

当您完成所有这些操作时,您的代码将是最佳的。

于 2009-06-03T21:58:34.223 回答
0

在这种情况下,您不应该有任何性能问题,但是如果数据源相同,则使用单个连接是一种很好的做法。

更好的方法是将单个打开的连接对象传递给每个 GetClients 和 GetDealers 函数。

于 2009-06-03T20:47:32.947 回答
0

连接是自动池化的,所以成本非常小。

然而,它不是零。每次从池中拉出连接并重新打开它时,都会向 SQL Server 发送 sp_reset_connection 命令。这是非常便宜的,所以我不会担心。

旁注:单个 ADODB.Connection 可能代表多个数据库连接。如果您尝试使用同一个记录集打开第二个记录集,同时仍在读取第一个记录集,则它有可能在后台创建一个新记录集。同样,这不是一个真正的问题,只是您应该知道的事情。

于 2009-06-03T20:53:22.997 回答
0

连接池可用于经典 ASP。我将重构该代码以使用接受连接字符串的方法,并在该方法中尽快打开和关闭连接。

至少与连接使用一样令人担忧的是,您没有使用断开连接的记录集(ADO.NET 默认实现该记录集)。断开连接的记录集允许您在完成查询后立即关闭连接并将其返回到池中,而不必等到您遍历记录集。

下面是在 JScript 中如何做到这一点;移植到 VBScript 应该很简单:

var sql = "select * from MyTable";
var cn = new ActiveXObject("ADODB.Connection");
var rs = new ActiveXObject("ADODB.Recordset");
var nothing = rs.ActiveConnection;
cn.Open(connectString);
rs.CursorLocation = 3; //adUseClient
rs.Open(sql, cn, 3, 1);
rs.ActiveConnection = nothing;
cn.Close();
//now do something with disconnected rs
于 2009-06-03T21:26:31.667 回答
0

连接应该被池化

于 2009-06-05T13:26:37.000 回答