我有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
答案 0 :(得分:1)
不,您没有为所有命令使用相同的连接,而是为每个命令打开一个新连接。由于您无法关闭它们,因此在代码末尾您将同时打开20个数据库连接。
此外,您没有使用单个数据读取器,而是为每个查询创建新的数据读取器。当您将方法结果分配给dr变量时,它不会重复使用数据读取器,它会丢弃对一个读取器的引用并将其替换为新读取器。为每个结果使用一个阅读器是正常的,但这意味着你必须在下一个之前关闭每个数据阅读器,否则你将获得一个无法访问数据库连接的无法访问的对象,直到垃圾收集器将其删除。
如果在下一个读取器之前关闭每个读取器,数据库连接将被关闭并返回到连接池,以便可以将其重新用于下一个查询。稍微好一点的是为页面创建一个连接对象并将其用于每个命令,这将节省几次到数据库的往返。