代码改变世界

管理连接

2008-09-11 15:33  晓彦  阅读(378)  评论(0)    收藏  举报

数据库连接是有限资源,它们的妥善管理对可扩展的应用程序来说是必不可少的。仅在需要时保持连接打开并尽快关闭是一个很好的实践。根据设计,绝大多数的 Database 类方法在每次调用时打开和关闭到数据库的连接。因为,应用程序代码不需要包含用于管理连接的代码。(默认情况下,基于性能的原因,ADO.NET 将连接返回到连接池中,而不是关闭他们。因此,不需要缓存 Database 对象。)

例如,ExecuteDataSet 返回包含所有数据的 DataSet 对象。这给了你一个自己的本地副本。对 ExecuteDataSet 的调用打开了一个连接、组装了一个 DataSet、然后在返回结果前关闭连接。

下列代码示范了 ExecuteDataSet 方法的使用。

C#

Database db = DatabaseFactory.CreateDatabase();

 

string sqlCommand = "Select ProductID, ProductName From Products";

DbCommand dbCommand = db.GetSqlStringCommand(sqlCommand);

 

// No need to open the connection; just make the call.

DataSet customerDataSet = db.ExecuteDataSet(dbCommand);

 

Visual Basic

Dim db As Database = DatabaseFactory.CreateDatabase()

 

Dim sqlCommand As String = "Select ProductID, ProductName From Products"

Dim dbCommand As DbCommand = db.GetSqlStringCommand(sqlCommand)

 

' No need to open the connection; just make the call.

Dim customerDataSet As DataSet = db.ExecuteDataSet(dbCommand)


然而,在关闭连接时有一些未清理的其他情况。一个例子就是 ExecuteReader 方法。此方法返回实现 IDataReader 接口的对象。Database 基类有一个返回 DbDataReader 对象的默认实现。DbDataReader 对象被设计用来读取需要的数据的特定部分,它需要一个打开的连接。换句话说,它不知道应用程序何时不再需要 DbDataReader 。如果数据访问应用程序块在返回 DbDataReader 之前就关闭了连接,DbDataReader 对客户代码而言是无用的。因此,DbDataReader 方法指定底层的 ADO.NET 在 DbDataReader 完成后自动关闭连接。在这种情况下,它被认为是由应用程序确定 DbDataReader 及时关闭的最好方法,可以使用 DbDataReader.close 方法显示的关闭 reader 或者强制 DbDataReader 的销毁,这是 Close 方法被调用的结果。

下列代码示范了对 ExecuteReader 方法的调用。using 语句(在 Visual Basic 中为 Using )确保 DbDataReader 对象被销毁,并在销毁的过程中关闭 DbDataReader 对象。

C#

Database db = DatabaseFactory.CreateDatabase();

 

DbCommand dbCommand = db.GetSqlStringCommand("Select Name, Address From Customers");

using (IDataReader dataReader = db.ExecuteReader(dbCommand))

{

// Process results

}

 

Visual Basic

Dim db As Database = DatabaseFactory.CreateDatabase()

 

Dim dbCommand As DbCommand = db.GetSqlStringCommand("Select Name, Address From Customers")

 

Using dataReader As IDataReader = db.ExecuteReader(dbCommand)

 

 ' Process results

 

End Using