Momenteel ben ik bezig met een Access 2000 gebaseerde applicatie die benaderd wordt via ADO 2.8 library. Deze applicatie heeft een importeer functie die vaak grote hoeveelheden records met (rond de 25000) wegschrijft in een tabel.
Nu blijkt dat de applicatie bij grote importbestanden onstabiel wordt en soms crasht. Ook is te zien dat de applicatie zeer veel geheugen snoept (soms 100MB!) tijdens het schrijven van de records. Het geheugen wordt meestal pas na een minuut of 5 weer vrijgegeven ondanks dat de connectie met de database wordt gesloten.
Na gegoogled te hebben kwam ik uit op het volgende MS artikel:
http://support.microsoft....aspx?scid=kb;en-us;248014
Alles wat in dit artikel staat komt overeen met mijn probleem. Als oplossing zegt MS het volgende:

Deze simpele app schrijft het aantal aangegeven weg in een tabel met een auto ID en een Tekst veld.
Geheugen voor het schrijven van 25000 records

Geheugen na het schrijven van 25000 records

De oplossing om de "Jet OLEDB:Max Buffer Size" aan te passen heeft bij mij geen effect. Het geheugengebruik is hetzelfde als ik deze property niet wijzig. Misschien dat iemand dit probleem kent of een andere oplossing kan aandragen.? Thanx
Nu blijkt dat de applicatie bij grote importbestanden onstabiel wordt en soms crasht. Ook is te zien dat de applicatie zeer veel geheugen snoept (soms 100MB!) tijdens het schrijven van de records. Het geheugen wordt meestal pas na een minuut of 5 weer vrijgegeven ondanks dat de connectie met de database wordt gesloten.
Na gegoogled te hebben kwam ik uit op het volgende MS artikel:
http://support.microsoft....aspx?scid=kb;en-us;248014
Alles wat in dit artikel staat komt overeen met mijn probleem. Als oplossing zegt MS het volgende:
Ook geeft MS voorbeeldcode waarmee ik een simpel programma heb gemaakt die records wegschrijft in een lusje.The Max Buffer Size property control is the maximum amount of memory that can be used by the read-ahead/write-ahead Jet cache.
RESOLUTION
Set the Jet OLE DB:Max Buffer Size property to a value such as 2048 kilobytes. When using ADO, the property must be set after opening the connection.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| Private Sub Command1_Click() Dim conn As New Connection Dim x As String conn.Open "provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\MyDB.mdb" conn.Properties("Jet OLEDB:Max Buffer Size") = 2048 x = String$(1000, "x") conn.Execute "DELETE FROM MyTable", , adExecuteNoRecords For i = 1 To Val(txtNumRecords) conn.Execute "INSERT INTO MyTable (Tekst) VALUES('" & x & "')", , adExecuteNoRecord Command1.Caption = "Writing record " & i DoEvents Next i conn.Close Set conn = Nothing End Sub |

Deze simpele app schrijft het aantal aangegeven weg in een tabel met een auto ID en een Tekst veld.
Geheugen voor het schrijven van 25000 records

Geheugen na het schrijven van 25000 records

De oplossing om de "Jet OLEDB:Max Buffer Size" aan te passen heeft bij mij geen effect. Het geheugengebruik is hetzelfde als ik deze property niet wijzig. Misschien dat iemand dit probleem kent of een andere oplossing kan aandragen.? Thanx
[ Voor 4% gewijzigd door pjonk op 30-12-2005 15:47 ]
It’s nice to be important but it’s more important to be nice