Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[VB6] databaseverbinding openhouden of niet? *

Pagina: 1
Acties:

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10 13:23
Al enkele jaren ontwikkel ik diverse applicaties die gebruik maken van een database. Deze databases zijn veelal MSDE of SQL-server. De ontwikkeltaal is VB6 en de connecties worden middels ADO tot stand gebracht; geen ADO.Net voor alle duideijkheid. Momenteel ben ik mezelf C# aan het aanleren en heb e.e.a. gelezen over ADO.Net en de connection-pooling.

De verbinding met de database wordt bij het starten van het programma opgezet en pas afgesloten als het programma wordt afgesloten. Nu heb ik ook een aantal programma's die eigenlijk 24/7 operationeel zijn, en dus een continue database-verbinding hebben (soort database-conversie tooltjes). Als de MSDE-server wegvalt (onderhoud aan de server o.i.d.), dan loopt het programma, logischerwijs, vast omdat deze database niet meer benaderd kan worden.

Oplossing hiervoor is om de databaseverbinding pas tot stand te brengen als het daadwerkelijk nodig is. ( Bij programma's die pollen of b.v. een uur geen database-calls hebben). Na de SQL-acties (select,insert,update), kan de databaseverbinding weer afgesloten worden. Als de database dan niet gevonden of geopend kan worden, gewoon negeren en b.v. 5 minuten later weer proberen.

Graag zou ik willen weten of bovenstaande een juiste benadering is, welke negatieve effecten dit kan hebben en of er eventueel alternatieven zijn.....

  • vorlox
  • Registratie: Juni 2001
  • Laatst online: 02-02-2022

vorlox

I cna ytpe 300 wrods pre miute

uh ja en nee, het probleem of de vraag die je schets heeft me al meerdere malen bezig gehouden.
Ik los het nu op door met een soort mysql-ping op te vragen of de verbinding nog leeft. zo niet doe ik eerst een connect.
Je zei VB6 toch...dan kun je zelfs met een goto even verspringen (dirty alright, maar het heeft voor mij in VB6/Foxpro altijd gewerkt gheghe)

Anderszins is het volgens mij goed om te bekijken of je wel altijd die verbinding nodig hebt, bij een koppelingetje snap ik dat wel echter, het kan zijn dat je door die altijd openstaande verbinding, het aantal concurrent gebruikers per DB verminderd terwijl je bij een connect / disconnect dus meer gebruikers kwijt kan. Maar dit is een naar mijn mening moeilijke afweging.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:37

TeeDee

CQB 241

Even voor de duidelijkheid: je hebt het nu wel over ADO.net of gaat het om de legacy zaken? En ten 2e: jij houdt nu altijd de connectie open?

Gewoon de connectie sluiten lijkt me het beste. Dit wordt door ADO.net als het goed automagisch in een pool geplaatst en opnieuw in gebruik genomen waar nodig.

Je kan toch gewoon de ConnectionState opvragen / bekijken? Evt. met een Timeout van n seconden en bij een timeout het process weer laten slapen als er geen reactie is.

Heart..pumps blood.Has nothing to do with emotion! Bored


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10 13:23
voor alle duidelijkheid: het is geen ado.net en ja, ik houd nu de verbinding open..

Verwijderd

Volgens mij gaat het over VB6+ADO (maar begin idd te twijfelen).
Je wil toch wat je gezien hebt bij C#+ADO.Net ook toepassen in VB6+ADO?
-> ja dus ;)

Even twee dingen gescheiden houden: Pooling en connectie sluiten.
Pooling is dat je een verzamelbak hebt met connecties die je weer uit kan delen. In jouw voorbeeld van VB6-programma's die eventueel uit dezelfde pool connecties plukken, weet ik niet of dat überhaupt kan...

Connecties sluiten: Als je een uur lang geen database verkeer hebt, dan is het natuurlijk zonde om de connectie open te houden. Zeker als meerdere programma's dat op dezelfde server doen.
Als je per minuut X opdrachten krijgt waardoor toch effectief je connectie altijd open is, dan zou je het kunnen overwegen.
Ook misschien als het zo tijd-kritisch is, dat elke opdracht binnen X millisecs afgerond moet worden. Dan win je in ieder geval tijd door een open connectie te houden.

ConnectionState wil nog vaak foutieve waarden geven als de connectie verloren is gegaan (mijn ervaring met oudere ADO-versies). Een makkelijke workaround hiervoor is een dummy query te sturen (iets als SELECT N'Testing connection...' ).

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10 13:23
even voor alle duidelijkheid: ik maak gebruik van VB6 en ADO, en geen ADO.Net. Connection pooling zoals ADO.Net dat kent, is dus hier niet van toepassing.

1 van de programma's doet iedere 5 minuten een query en converteert de data naar een ander bestand. Dit is absoluut niet tijd gebonden. Komt de query een minuut later, no big deal.

Een ander programma heeft een permanente verbinding met een database en bezoekers melden zich aan. Hier kan dus makkelijk een uur, drie uur of een weekeind tussen zitten.

wat is wijs ?

  • Kalentum
  • Registratie: Juni 2004
  • Nu online
Dat programma dat 1x per X minuten iets doet kun je beter een tooltje van maken die je via een scheduler start. Verbinding opbouwen, gegevens ophalen, bestandje maken, verbinding sluiten.

En dat andere programma... je kan toch de verbinding opbouwen op het moment dat de gebruiker zich aanmeldt? En voor de duur van de sessie de verbinding ophouden?

  • elhopo
  • Registratie: December 2005
  • Laatst online: 18-11 13:49
Voor het 1e programmaatje: openen, doe je ding en meteen weer sluiten lijkt me.

Voor het 2e programmaatje: kijk of je het zo kan maken dat alles via 1 centrale routine loopt. In die routine open je de database, en sluit je hem weer wanneer bijv na 1 minuut de database niet meer is gebruikt. Zo heb je geen vertraging als je veel achter elkaar doet, maar hou je de database ook niet al te lang open. Binnen VB6 is dat prima te doen, via een timer. Deze kan je op een form prakken, en in een class overnemen (withevents)

Blijkt dat citroenvlinders helemaal niet naar citroen smaken.


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10 13:23
rutgerw schreef op donderdag 14 februari 2008 @ 08:54:
Dat programma dat 1x per X minuten iets doet kun je beter een tooltje van maken die je via een scheduler start. Verbinding opbouwen, gegevens ophalen, bestandje maken, verbinding sluiten.

En dat andere programma... je kan toch de verbinding opbouwen op het moment dat de gebruiker zich aanmeldt? En voor de duur van de sessie de verbinding ophouden?
ik wil dus geen gebruik maken van de scheduler van MS (slechte ervaringen mee). Ik kan inderdaad de database openen als dat nodig is en sluiten als de aanmelding is volooid.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 23:37

TeeDee

CQB 241

pkouwer schreef op donderdag 14 februari 2008 @ 09:32:
[...]
ik wil dus geen gebruik maken van de scheduler van MS (slechte ervaringen mee).
Kan je dan niet beter een windows service ervan maken?

Heart..pumps blood.Has nothing to do with emotion! Bored


  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10 13:23
hoe doe je dit dan in ASP.Net ? Maak je dan ook bij iedere aanroep een verbinding ?

  • pkouwer
  • Registratie: November 2001
  • Laatst online: 07-10 13:23
kick

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-11 18:33
pkouwer schreef op donderdag 14 februari 2008 @ 16:20:
hoe doe je dit dan in ASP.Net ? Maak je dan ook bij iedere aanroep een verbinding ?
Ik zie niet hoe je dit anders zou moeten doen aangezien nadat een request is afgehandeld alle objecten weer worden opgeruimd.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1