2009-10-07 4 views
0

J'ai 20 méthodes différentes et utiliser le lecteur de données pour lire et obtenir le résultat de ces fonctions dans le même événement. En haut de page je crée le lecteur de données et commence à le charger étape par étape (il utilise même connexion et même fonction d'accès aux données) .Tout 15. lecteur de données de fonction charge sans problème, mais après 15, il charge lentement (nombre d'enregistrements est d'environ 20-30) .Quand je ferme le lecteur de données après 15.fonction, ce problème ne se produit pas.Mais maintenant après 15.function, je devrais fermer le lecteur de données si j'exécute une fonction.Pourquoi ce problème se produit-il, je ne sais pas.J'ai posté le code d'échantillon ici.Problème de vitesse de datareader dans vs.2008

'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. APRÈS L'EXÉCUTION, datareader COMMENCE À LOAD DATA SLOWLY.WHEN I ADD dr.Close et de l'exécuter, je n'ai pas problème.Si Je ne fais pas IT, IT RECORDS 20 CHARGES 5 Withing EST secondes.Cela Ma fonction READANDBIND.Je suis en train de me connecter à l'oracle 11 G. QU'EST-CE QUI PEUT PROVOQUER CE PROBLÈME?

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 

Répondre

1

Non, vous n'utilisez pas la même connexion pour toutes les commandes, vous ouvrez une nouvelle connexion pour chacune d'entre elles. Comme vous ne parvenez pas à les fermer, à la fin du code, vous aurez 20 connexions de base de données ouvertes à la fois.

En outre, vous n'utilisez pas un lecteur de données unique, vous créez un nouveau lecteur de données pour chaque requête. Lorsque vous affectez le résultat de la méthode à la variable dr, il ne réutilise pas le lecteur de données, il rejette la référence à un lecteur et la remplace par une nouvelle. Il est normal d'utiliser un lecteur pour chaque résultat, mais cela signifie que vous devez fermer chaque lecteur de données avant de passer au suivant, sinon vous obtiendrez un objet inaccessible qui reste attaché à une connexion de base de données jusqu'à ce que le garbage collector le supprime. Si vous fermez chaque lecteur avant d'obtenir le suivant, la connexion à la base de données sera fermée et renvoyée au pool de connexions afin qu'elle puisse être réutilisée pour la requête suivante. Un peu mieux serait de créer un seul objet de connexion pour la page et de l'utiliser pour chaque commande, ce qui économisera quelques allers-retours à la base de données.

+0

Merci Guffa, vous avez raison.Je pense que vous voulez dire que jusqu'à 15.Méthode, 15 connexion est en vie et donc il peut tomber en panne de performance.Am je raison? – Alexander

+0

ur tip travaillé.Je suis en utilisant la même connexion et il a augmenté les performances.Merci à nouveau. – Alexander

Questions connexes