Hej, Varför inte skapa en metod som hämtar kunden bara: Håller med Patrik där. Hur menar du att du instansierar Customer? Hej, Databasåtkomstklasser
Jag använder VB .NET för att skriva databasåtkomstsklasser till mina webbapplikationer. Dessa klasser gör sedan vidare utveckling och optimisering betydligt enklare. Vad jag däremot funderar på är om det inte vore smidigare att köra vissa datahämtningar via SQL istället för via flera klasser? Hur mycket prestandaskillnad blir det på att öppna en anslutning och skicka med en lite mer komplicerad SQL-sträng mot att öppna två anslutningar (inte samtidigt) där jag skickar lite enklare SQL-strängar?
Ett exempel:
Private Function LoadCustomer(ByVal ProjectID As Integer) As String
Dim aProject As New DALProjects(ProjectID) 'Laddar projektet
Dim aCustomer As New DALCustomers(aProject.CustomerID) 'Laddar kunden utifrån projektets KundID
Return aCustomer.Name 'Returnerar den laddade kundens namn
End Function
Koden ovan kör alltså totalt två frågor för att hämta kundnamn för ett projekt. Ger det då inte bättre prestanda att skicka EN SQL-sträng enligt nedan? Hur skulle man hantera detta i databasåtkomstklasser?
SQL = "SELECT kund.Kundnamn FROM Kunder AS kund, Projekt AS proj WHERE proj.KundID = kund.ID
AND proj.ID = <mittmedskickadeID>"
Tack på förhand!
Sv: Databasåtkomstklasser
Dim cust As Customer = DAL.GetCusomerForProject(projectId);
och använd join i sqln:
<code>
sql = " SELECT kund.* From Kunder inner join Projekt on project.kund_id = kunder.kund_id where project.id = @projid"
</code>
Sv:Databasåtkomstklasser
Dock skulle jag rekommendera dig att köra lagrade procedurer istället för ren sql. Dels för prestanda men även för lättare felsökning. Just nu innehåller pellesofts databas 655 lagrade procedurer :-)
Sen är det ju i snitt 41 anrop/sekund till databasen också..Sv:Databasåtkomstklasser
Jag laddar en kund direkt från databasen när jag skriver
Dim cust As New Customer(ID)
Om jag då ska sätta en likamed måste jag först ladda vilken kund projektet har, och sedan ladda kundens data, vilket totalt blir två anslutningar mot databasen.
Hur mycket prestandaskillnad gör två anslutningar gentemot en?
Dessvärre använder jag Access som databas, vilket gör att jag inte kan använda mig av Stored Procedures. Annars hade det givetvis varit att föredra framför ren SQL. Jag använder dock paramteriserade SQL-strängar.
Sv: Databasåtkomstklasser
Njae, det är nog tänkt som att du i det här fallet inte skapar ett Customer-objekt alls.
Utan i Project inkluderar du kundnamn om du bara ska ha med kundnamn när du hämtar ett projekt.
Då inkluderar du kundnamnet eller en instans kundklassen i Project och hämtar båda sakerna med SQL Join.
Det blir att gå ifrån teoretisk objektorientering en aning, men ngt bättre prestanda blir det med bara en roundtrip till databasen. Det gäller i synnerhet om databasen finns på en annan fysisk dator.
I det här fallet är det nog ingen fara, du har en Access-databas, förmodligen på samma server?
Då blir det ju inte speciellt mycket overhead i din roundtrip.
Dessutom har du connection-pooling inbyggt i ADO.NET (i gamla ADO också). Det funkar så att ditt connection objekt läggs i en Object pool i COM+ ihop med några fler instanser av samma koppling.
Vid nästa request kommer en connection att hämtas från poolen i första hand. Och det går väldigt snabbt. Dvs i ditt exempel så kommer du med all sannolikhet att använda SAMMA fysiska connection vid två anrop på raken, och det kostar inte så mycket som man kan tro då.