Acces 2007 - Datenbank "überlastet"?!

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von SAR-71.

    Acces 2007 - Datenbank "überlastet"?!

    Moin,

    ich habe eine DB die noch relativ klein ist (Erstmal zum Testen, hat somit nur 7 Datensätze)

    So, also mein Code zusammen gebastelt damit ich eine kleine "Suchfunktion" habe -> Keine Probleme, läuft alles 1a


    Dann weiter im Text: Zwei Funktionen (Ich sag mal: "main_func" und "get_data")
    "main_func" enthält eine For-Next-Schleife und in dieser Schleife wird die Funktion "reader" ausgeben die mir bestimmte Teile der DB ausgibt (Mit dem Ergebnis wird dann mit in weiteren Funktionen verabeitet, hat aber nichts mehr mit der DB zu tun)

    Anfangs kein Problem, hab zum testen auch zwischen jedem Aufruf eine Thread.Sleep mit 100ms
    Nachdem aber ~60x auf die DB Zugeriffen wurde heißt es: "Unbekannter Fehler"


    So hier mal die relevanten Schnippsel:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Function get_data(ByRef Name As String, ByRef Multi As Boolean) As Object
    2. '// Verbindung herstellen:
    3. '//Step 1: Deklarieren
    4. Dim con As New OleDb.OleDbConnection
    5. Dim cmd As New OleDb.OleDbCommand
    6. Dim reader As OleDb.OleDbDataReader
    7. Dim datas As Object
    8. Dim sw As Stopwatch = Stopwatch.StartNew
    9. '//Step 2: Laden der DB
    10. con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & db_location & ";Persist Security Info=False;"
    11. cmd.Connection = con
    12. '//Step 3: Lesen der DB
    13. con.Open()
    14. cmd.CommandText = "select * from tabelle1"
    15. reader = cmd.ExecuteReader
    16. Dim stb As New System.Text.StringBuilder
    17. Do While reader.Read
    18. If reader("wert") = Name Then
    19. stb.Append(reader("wert") & ";")
    20. stb.Append(reader("typ") & ";")
    21. stb.Append(reader("p1") & ";" & reader("p2") & ";" & reader("p3") & ";" & reader("p4") & ";" & reader("p4") & ";" & reader("p5") & ";" _
    22. & reader("p6") & ";" & reader("p7") & ";")
    23. stb.Append(reader("com"))
    24. If Not Multi Then
    25. con.Close()
    26. End If
    27. Exit Do
    28. End If
    29. Loop
    30. If Not stb.ToString = "" Then
    31. datas = Split(stb.ToString, ";")
    32. sw.Stop()
    33. datas(10) = sw.ElapsedMilliseconds
    34. Return datas
    35. Exit Function
    36. End If
    37. sw.Stop()
    38. Dim err(1) As String
    39. err(0) = "unkown"
    40. err(1) = sw.ElapsedMilliseconds
    41. Return err
    42. End Function



    Der Fehler taucht in Zeile 17 auf
    Leider hab ich keine Ahnung wie ich damit umgehen soll bzw. diesen Fehler verhindern kann

    Weiß jemand weiter? :D


    Und bevor ich es vergesse: Das mit Multi ist absichtlich so
    Wenn ich das ohne meiner komischer Multi-Verzweigung mache brauche ich so ~50-100ms zum lesen

    Mit dem Mulit sind es so ~5-15ms (Und das ist ein deutlicher Unterschied)
    Natürlich wird beim letzten Aufruf das Multi auf False gesetzt








    Mfg.
    SAR

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SAR-71“ ()

    Also das mit deiner Reader-While-Schleife ist mir etwas suspekt.
    Das muss doch auch anders gehen.
    Ich kann deinen Code jetzt nicht testen, aber der Verdacht liegt nahe,
    dass zuviele Objekte erzeugt werden, die sich stören.
    Versuche doch mal con und cmd nach Benutzung auf Nothing zu setzen.
    Wenn du schreibst, dass du am Ende Multi auf False setzt, heißt das dann,
    dass du bei jedem Aufruf von get_data ein neues con und cmd erzeugst?
    Beim Testen hatte ich beim ersten Durchlauf das "cmd.Close()"-Command vergessen und mich gewundert warum es schnell ging
    Also hab ich die kleine "Multi"-Funktion dazu gebaut

    Ich hab das ganze jetzt mit einer kleinen Notlösung gemacht und zwar, speicher ich die Daten in groooßen Arrarys ab und prüfe dann ob der jeweilige Wert vorhanden ist


    Dann werd ich morgen mal die drei Kanditaten "leeren" (Mit Glück gibt es mir noch einen kleinen Geschwindigkeitsbonus, mit Pech das Gegenteil








    Mfg.
    SAR
    Ist jetzt zwar nicht morgen gewesen:
    Da es immer mehr Werte werden, wird die Notlösung immer unattraktiver

    Ich hab nun die benutzten Werte auf Nothing gesetzt, aber es tritt immer noch dieser Fehler auf


    Hier mal der komplette Fehler:
    Spoiler anzeigen

    Quellcode

    1. Eine Ausnahme (erste Chance) des Typs "System.Data.OleDb.OleDbException" ist in System.Data.dll aufgetreten.
    2. System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unbehandelte Ausnahme</Description><AppDomain>Analog - Main.vshost.exe</AppDomain><Exception><ExceptionType>System.Data.OleDb.OleDbException, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Unbekannter Fehler</Message><StackTrace> bei System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
    3. bei System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
    4. bei System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
    5. bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
    6. bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
    7. bei System.Data.OleDb.OleDbConnection.Open()
    8. bei Analog___Main.checker.get_data(String&amp;amp; Name, Boolean&amp;amp; Multi) in C:\Users\SAR\Desktop\Main\Arbeitsdaten\Projekte\Main\Analog - Main\Analog - Main\checkpx.vb:Zeile 83.
    9. bei Analog___Main.checker.get_card_hand(Int32&amp;amp; points) in C:\Users\SAR\Desktop\Main\Arbeitsdaten\Projekte\Main\Analog - Main\Analog - Main\checkpx.vb:Zeile 211.
    10. bei Analog___Main.Form1.Button3_Click(Object sender, EventArgs e) in C:\Users\SAR\Desktop\Main\Arbeitsdaten\Projekte\Main\Analog - Main\Analog - Main\Form1.vb:Zeile 22.
    11. bei System.Windows.Forms.Control.OnClick(EventArgs e)
    12. bei System.Windows.Forms.Button.OnClick(EventArgs e)
    13. bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    14. bei System.Windows.Forms.Control.WmMouseUp(Message&amp;amp; m, MouseButtons button, Int32 clicks)
    15. bei System.Windows.Forms.Control.WndProc(Message&amp;amp; m)
    16. bei System.Windows.Forms.ButtonBase.WndProc(Message&amp;amp; m)
    17. bei System.Windows.Forms.Button.WndProc(Message&amp;amp; m)
    18. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp;amp; m)
    19. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp;amp; m)
    20. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    21. bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp;amp; msg)
    22. bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
    23. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    24. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    25. bei System.Windows.Forms.Application.Run(ApplicationContext context)
    26. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    27. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    28. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    29. bei Analog___Main.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    30. bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
    31. bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    32. bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    33. bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    34. bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    35. bei System.Threading.ThreadHelper.ThreadStart()</StackTrace><ExceptionString>System.Data.OleDb.OleDbException: Unbekannter Fehler
    36. bei System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
    37. bei System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
    38. bei System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup)
    39. bei System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
    40. bei System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
    41. bei System.Data.OleDb.OleDbConnection.Open()
    42. bei Analog___Main.checker.get_data(String&amp;amp; Name, Boolean&amp;amp; Multi) in C:\Users\SAR\Desktop\Main\Arbeitsdaten\Projekte\Main\Analog - Main\Analog - Main\checkpx.vb:Zeile 83.
    43. bei Analog___Main.checker.get_card_hand(Int32&amp;amp; points) in C:\Users\SAR\Desktop\Main\Arbeitsdaten\Projekte\Main\Analog - Main\Analog - Main\checkpx.vb:Zeile 211.
    44. bei Analog___Main.Form1.Button3_Click(Object sender, EventArgs e) in C:\Users\SAR\Desktop\Main\Arbeitsdaten\Projekte\Main\Analog - Main\Analog - Main\Form1.vb:Zeile 22.
    45. bei System.Windows.Forms.Control.OnClick(EventArgs e)
    46. bei System.Windows.Forms.Button.OnClick(EventArgs e)
    47. bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    48. bei System.Windows.Forms.Control.WmMouseUp(Message&amp;amp; m, MouseButtons button, Int32 clicks)
    49. bei System.Windows.Forms.Control.WndProc(Message&amp;amp; m)
    50. bei System.Windows.Forms.ButtonBase.WndProc(Message&amp;amp; m)
    51. bei System.Windows.Forms.Button.WndProc(Message&amp;amp; m)
    52. bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&amp;amp; m)
    53. bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&amp;amp; m)
    54. bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    55. bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&amp;amp; msg)
    56. bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
    57. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    58. bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    59. bei System.Windows.Forms.Application.Run(ApplicationContext context)
    60. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    61. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    62. bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    63. bei Analog___Main.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    64. bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
    65. bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    66. bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    67. bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    68. bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    69. bei System.Threading.ThreadHelper.ThreadStart()</ExceptionString></Exception></TraceRecord>
    Leider habe ich keine Möglichkeit deinen Code zu testen, da ich diesen Provider nicht besitze.
    Du sagtest aber, dass es in der Zeile 17 wäre, wo der Fehler auftritt.
    Dort wird der ConnectionString angewendet. Steht in diesem Moment dort alles noch so drin, wie du es
    übergeben hast?

    Normalerweise würde es ja eine entsprechende klare Meldung geben, falls die Verbindung
    in diesem Moment noch nicht wieder geschlossen ist. Aber vielleicht hast du auch nur
    ein Timing Problem. Wie schnell öffnest und schließt du die Verbindung?
    Vielleicht ist der Provider überlastet. Warte doch einfach mal einen kleinen Moment.

    Ohne richtig testen zu können ist es für mich ein Ratespiel. Sorry.
    Vielleicht wird dein con Verbindung auch nicht geschlossen.
    Lass dir doch einfach mal eine Msgbox anzeigen, wenn in der if Anweisung con.close() ausgeführt wird damit du sicher bist, dass dies auch geschieht.

    Füge mal ab Zeile 43

    VB.NET-Quellcode

    1. reader.close()
    2. con.close()


    ein.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „HerrFrie“ ()

    Hab jetzt weiter rumgespielt und es scheint der Fall zu sein der Provider überlastet ist

    So mal ne kleine Rechnung wie es war:
    3 Schleifen laufen durch (Noch die eine Schleife die aus DB liest, aber dort kommt kein Fehler vor)
    Die erste wird 52x aufgerufen

    Die erste ruft S2 auf (S2 = Schleife 2)
    S2 hat 7 Durchläufe, diese öffnen die DB und schliessen sie wieder

    52 * 7 = 364

    Dann kommt die S3, die genau das gleiche wie S1 macht nur mit anderen Parametern
    Also:
    aurufe = 364 + 364
    aurufe = 728

    Das ganze rattert so mit 40ms durch
    Also:
    aufrufe = 728 / 40ms
    aufrufe = ~18 aufrufe/ms



    So, ich hab mir nun globale Variabeln gemacht und nun braucht er geschlage 4500ms zum durchrattern
    Hmm, ich fand das andere besser, aber hier gibt es keinen Fehler

    Ich muss mir wohl eine andere Methode suchen, dass totrattern hat wohl keinen Sinn

    Kann ich theoretisch mit 2 Threads auf die gleiche DB zugreifen (Praktisch mit zwei Unterschiedlichen Readern)?










    Mfg.
    SAR
    Hmm, dann bin ich mal gespannt wie viele Sessions gleichzeitig möglich sind (Bzw. in welchem Bereich muss das sein, damit es annehmbar ist)
    Bedeutet jetzt eine knifflige Multithreading Anweisung

    Naja, dann wirds wohl sein
    Danke für eure Hilfe





    Edit: Ich hab die anstengende Mühe gemacht und alles in 3 Threads verteilt
    Aber, einen Geschwindigkeit Bonus gibt es nicht, es dauert immer noch 4s ...







    Mfg.
    SAR

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „SAR-71“ ()