2016-07-26 27 views
1

Ich muss meinen Datenzugriff über ADO.Net optimieren. Für Anfragen des Projekts kann ich nicht Linq oder Entity ...Abfragen parallel ausführen

So starten ich 15 unabhängige ADO.NET Abfragen. Ich folge den Standards, öffne die Verbindung, starte die Abfrage, benutze den DataReader um die Daten zu bekommen, speichere sie in Klassen und schließe schließlich die Verbindung ...

Aber ich fühle mich wie das Projekt ist nicht schnell genug. Also, Jungs, können Sie mir alle ein paar Tipps zur Verbesserung der Geschwindigkeit beibringen?

Meine Datenbank ist SQL Server, und soweit ich kann, laue ich Abfragen nach Entitäten.

EDITED:

private void Connect(string comando) { 
    try { 
     string cadena = "connection_data"; 
     Cn = new SqlConnection(cadena); 
     Cn.Open(); 
     SqlCommand Com = new SqlCommand(comando, Cn); 
     Datos = Com.ExecuteReader(); 
    } 
    catch (Exception e) 
    { 
     // 
    } 
} 

    private void Close() 
    { 
     try 
     { 
      Cn.Close(); 
      Datos.Close(); 
     } 
     catch (Exception e) 
     { 
      // 
     } 
    } 

    public List<class1> getClass1(double id) 
    { 
     Connect("SELECT TOP (5) CASE WHEN [table1].[attribute1] IN (7, 12, 13, 14, 15, 16, 17, 18, 19, 28, 29) THEN 'random_name' " + 
      "WHEN [table1].[attribute3] = NULL AND [table1].[attribute2] = NULL THEN 'random_name2' WHEN [table1].[attribute3] = NULL THEN [table1].[attribute3] ELSE " 
// bla bla bla bla and so on and I have 15 massive queries like this one; 

     List<class1> res = new List<class1>(); 

     if (Datos.HasRows == true) 
     { 
      while (Datos.Read()) 
      { 
       class1obj = new class1(); 
       obj.at1= class1.cont + 1; 
       obj.at2= class1.cont + 1; 
       class1.cont++; 
       obj.at3= "random_value"; 
       obj.at4= Datos.GetValue(0); 
       obj.at5= Datos.GetValue(1); 
       res.Add(obj); 
      } 
      Close(); 
     } 
     return res; 
    } 
+0

Sie sollten den Code und die Abfragen zeigen ... –

+0

@Gilad Green. Warum? Standard-Abfragen mit Standard-Code ... Die Abfragen sind optimiert und der Code ist der Standard ... Wie auch immer, nur für wenn ich etwas vermisse, bearbeite ich es ... –

+1

Ya kann ich das verstehen, aber ich sage über Code und Abfragen, denn vielleicht kann man Abfragen beitreten oder vielleicht können Sie Dinge parallel tun. In jedem Fall, um das zu bestimmen und keine irrelevanten Antworten zu geben, ist ein Code nützlich –

Antwort

1

Wenn Sie für jede Klasse haben Sie dann eine Funktion zu schaffen, was Sie tun können, so etwas wie dieses:

Statt eine Funktion getClass1 des Habens eine Schnittstelle:

Fügen Sie eine Basisklasse für die Schnittstelle hinzu, die als Abhängigkeit ein Verbindungsobjekt zur Datenbank

anfordert
public abstract class BuildClassBase<TClass> : IBuildClass<TClass> 
{ 
    public BuildClassBase(SqlConnection connection) 
    { 
     Connection = connection; 
    } 

    public async Task<IEnumerable<TClass>> BuildAsync(double id) 
    { 
     //Execute query and pass results to InnerBuid 
     return InnerBuildAsync(/*Pass DataTable*/); 
    } 

    public abstract async Task<IEnumerable<TClass>> InnerBuildAsync(DataTable data); 

    //Ctor of each derived class will set the value 
    public string Query { get; protected set; } 
    public SqlConnection Connection {get; set; } 
} 

Und dann eine spezifische Implementierung passend zu jeder Klasse, die Sie erstellen möchten. Sie können auch eine Fabrik für sie hinzufügen:

public interface IBuildClassFactory 
{ 
    IBuildClass<TClass> GetBuilder<TClass>(); 
} 

dann in Ihrem Code, wo Sie derzeit alle 15 Methoden führen Sie eine Task für jede Klasse erstellen und dann await buildClassFactory.GetBuilder<ClassA>().BuildAsync(id). Etwas wie:

double id = 1; 
Task createClassA = buildClassFactory.GetBuilder<ClassA>().BuildAsync(id); 
Task createClassB = buildClassFactory.GetBuilder<ClassB>().BuildAsync(id); 
Task createClassC = buildClassFactory.GetBuilder<ClassC>().BuildAsync(id); 
.... 

Task.WaitAll(createClassA, createClassB, createClassC....); 

//And then get result from tasks 
+0

Uuuffff. Danke @Gilad Green. Es sieht aus, könnte Arbeit sein. Zumindest verbessert es meine Reaktionszeit. Aber das übertrifft mich. Ich werde Zeit brauchen, um es umzusetzen. Ich werde dich darüber informieren ... Danke Kumpel für deinen Erfolg ... Du bist cool :)))) –

+0

@EliasMP - mit viel Freude :) tief in Abhängigkeitsinjektion schauen - wirklich eine Verbesserung des Codes :) Lesen Sie darüber und vielleicht auch vorhergehende Fragen in SO darüber. checkt über IoC Container wie Castle Windsor/Ninject ...... –