vs.2008中的Datareader速度问题

时间:2009-10-07 07:05:03

标签: ado.net

我有20种不同的方法,并使用datareader在同一事件中读取并从这些函数中获取结果。在页面顶部我创建datareader,然后开始逐步加载它(它使用相同的连接和相同的数据访问功能).Till 15.function datareader加载没有问题但是在15之后,它加载缓慢(记录计数大约是20-30)。当我在15.function之后关闭datareader时,这个问题不会发生。但是现在在15.function之后,我应该如果我执行某个功能,关闭datareader。为什么会出现这个问题,我不知道。我在这里发布了示例代码。

'Trying method 1

strSQL.ToString="Select * from A"

dr = DB_Gateway.ReadAndBind(strSQL.ToString)


'Trying method 2

strSQL.ToString="Select * from B"

dr = DB_Gateway.ReadAndBind(strSQL.ToString)

'Trying method 15

strSQL.ToString="Select * from K"

dr = DB_Gateway.ReadAndBind(strSQL.ToString)

15。执行后,DATAREADER开始慢慢加载数据。当我添加DR.CLOSE并执行它时,我不会有任何问题。我不会这样做,它加载了20个记录,持续5秒。这是我的读取功能。我正在连接ORACLE 11 G.WHAT会引起这个问题吗?

Public Shared Function ReadAndBind(ByVal SQL As String) As OracleDataReader 




Dim oraCommand As New OracleCommand 




With oraCommand 

.Connection =


New OracleConnection(CONN_NAME) 

.CommandText = SQL




Dim dtreader As OracleDataReader 




Try

.Connection.Open()

dtreader = .ExecuteReader(CommandBehavior.CloseConnection)



Catch ex As Exception 

Exception_Save(ex.Message, oraCommand.ToString)




Throw



Finally



'.Connection.Close()



'.Connection.Dispose()

oraCommand.Dispose()

oraCommand =

Nothing



End Try



Return dtreader 




End With 






End Function

1 个答案:

答案 0 :(得分:1)

不,您没有为所有命令使用相同的连接,而是为每个命令打开一个新连接。由于您无法关闭它们,因此在代码末尾您将同时打开20个数据库连接。

此外,您没有使用单个数据读取器,而是为每个查询创建新的数据读取器。当您将方法结果分配给dr变量时,它不会重复使用数据读取器,它会丢弃对一个读取器的引用并将其替换为新读取器。为每个结果使用一个阅读器是正常的,但这意味着你必须在下一个之前关闭每个数据阅读器,否则你将获得一个无法访问数据库连接的无法访问的对象,直到垃圾收集器将其删除。

如果在下一个读取器之前关闭每个读取器,数据库连接将被关闭并返回到连接池,以便可以将其重新用于下一个查询。稍微好一点的是为页面创建一个连接对象并将其用于每个命令,这将节省几次到数据库的往返。