2009-09-09 5 views
2

Je suis dans un hoo-ha avec mon patron que je ne peux pas passer à l'utilisation de technologies plus récentes jusqu'à ce que j'ai des preuves de certains problèmes en suspens. L'une des principales préoccupations concerne la façon dont les dépôts traitent les connexions. L'un des frais généraux supposés les plus importants est la connexion et la déconnexion à la base de données. Si j'ai un référentiel où je fais ce qui suit:Regroupement Connexion Regroupement

public ContractsControlRepository() 
    : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

avec la classe comme ceci:

public class ContractsControlRepository : DataContext, IContractsControlRepository 

avec des fonctions telles que:

public IEnumerable<COContractCostCentre> ListContractCostCentres(int contractID) 
{ 
    string query = "SELECT C.ContractID, C.CCCode, MAC.CostCentre, C.Percentage FROM tblCC_Contract_CC C JOIN tblMA_CostCentre MAC ON MAC.CCCode = C.CCCode WHERE C.ContractID = {0}"; 
    return this.ExecuteQuery<COContractCostCentre>(query, contractID); 
} 

Maintenant, si dans mon action du contrôleur appelé _contractsControlRepository.ListContractCostCentres(2) suivi immédiatement d'un autre appel au référentiel, utilise-t-il la même connexion? Quand la connexion s'ouvre-t-elle dans le contrôleur? Quand est-il fermé?

Vive

EDIT

J'utilise LINQ écrit à la main comme suggéré par Steve Sanderson dans son ASP.NET MVC book.

EDIT EDIT

Pour clarifier les choses, j'utilise LINQ comme mon ORM, mais je suis en utilisant des requêtes SQL premières (comme le montre l'extrait ci-dessus) pour effectuer des requêtes. Par exemple, voici une action du contrôleur:

public ActionResult EditBusiness(string id) 
{ 
    Business business = _contractsControlRepository.FetchBusinessByID(id); 
    return View(business); 
} 

Je ne suis pas en train d'ouvrir/fermer des connexions.

est ici un plus grand, plus extrait complet de mon repo:

public class ContractsControlRepository : DataContext, IContractsControlRepository 
    { 
    public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 


public IEnumerable<COContractCostCentre> ListContractCostCentres(int contractID) 
{ 
    string query = "SELECT C.ContractID, C.CCCode, MAC.CostCentre, C.Percentage FROM tblCC_Contract_CC C JOIN tblMA_CostCentre MAC ON MAC.CCCode = C.CCCode WHERE C.ContractID = {0}"; 
    return this.ExecuteQuery<COContractCostCentre>(query, contractID); 
} 

Alors ContractsControlRepository est instancié dans mon contrôleur et utilisé comme _contractsControlRepository.ListContractCostCentres (2). Les connexions ne sont pas ouvertes manuellement, DataContext s'occupe de cela pour moi.

+0

Cela dépend de ce que vous utilisez pour générer le code du référentiel. Alors, quel logiciel ORM utilisez-vous? – blowdart

+0

@ Kezzer- J'ai ce livre et tandis que Steve utilise des attributs sur son modèle LINQ to SQL (par opposition au glisser-déposer), je ne vois nulle part dans le livre où il utilise SQL inline. Dans le livre, les requêtes sont écrites en utilisant LINQ. – RichardOD

+0

Je le sais, mais une exigence de notre système est de ne pas utiliser LINQ to SQL pour générer des requêtes SQL.Nous utilisons LINQ to SQL comme outil ORM et requêtes en ligne pour l'interrogation. Je dois le faire parce que mon patron me le dit. Je ne suis pas d'accord avec ça, je n'ai pas le choix jusqu'à ce que je puisse lui prouver que LINQ to SQL pour les requêtes n'est pas plus lent que les requêtes SQL directes. – Kezzer

Répondre

2

Sans connaître les détails de votre ORM et comment il connecte les pilotes de base de données SQL sera le pool de connexion. Lorsqu'une connexion est fermée, elle est libérée dans le pool et reste ouverte pendant X nombre de secondes (où X est configurable). Si une autre connexion est ouverte et que tous les paramètres correspondent (nom du serveur, nom de l'application, nom de la base de données, détails de l'authentification, etc.), toutes les connexions libres et ouvertes du pool seront réutilisées au lieu d'une nouvelle connexion.

N'ayant pas lu le livre en question, je ne sais pas ce qu'est réellement "linq manuel". Si c'est manuel signifie que vous récupérez les tables, alors évidemment vous faites la connexion ouvrir/fermer. Linq to SQL utilisera un nouvel objet de connexion lorsqu'une instruction est finalement exécutée, point auquel le regroupement de connexions entre en jeu - ce qui signifie qu'un nouvel objet de connexion peut ne pas être une nouvelle connexion réelle.

+0

Vérifiez mon commentaire à RichardOD et mon édition. J'utilise juste le SQL normal mais LINQ pour la modélisation. – Kezzer

+0

Je dis "manuel" dans le sens le plus léger. Fondamentalement, j'utilise LINQ pour ma modélisation, et les requêtes SQL pour interroger les données en arrière. Je n'utilise pas LINQ to SQL car cela suit une syntaxe que je n'utilise pas. Mon outil ORM est LING, mon outil d'interrogation utilise DataContext avec des requêtes SQL brutes. Je n'ouvre/ne ferme pas les connexions. – Kezzer

+0

OK alors ma réponse est là. – blowdart