If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Een beetje gaare oplossing IMO...Ik doe het dubbel omdat pconnect soms geen verbinding kan maken (bij herhaaldelijk op F5 bijv.)
De connectie zou gewoon moeten werken, ten aller tijde. Upgrade anders je database-server, deze kan het verkeer gewoon niet aan.
Je zou, al is het afgeraden, de connectie in een lusje kunnen zetten. Probeer het 3 keer, als daarna nogsteeds geen database connectie is laat de gebruiker het gewoon weten.
De connectie komt soms niet tot stand, terwijl er op dat moment weinig gebruikers online waren.
Maar dit is wel deels offtopic. Mijn vraag was hoe breekbaar dit kan zijn voor een database
[ Voor 22% gewijzigd door Guillome op 26-03-2010 12:31 ]
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Bedoel je dat je andere data dan verwacht hebt?
Misschien dat je sessies door elkaar lopen?
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Please note that mssql_pconnect creates a connection for the pool for *each process*. If you have "ThreadsPerChild" set to 50 in apache, and mssql.max_procs set to 25 in php, then eventually you will get mssql_pconnect failing to give you a connection to the database. This has stumped me for quite a while, and the answer finally presented itself thanks to the people in #php.
'if it looks like a duck, walks like a duck and quacks like a duck it's probably a duck'
Dat is altijd dom en geen oplossing. Op het moment dat je zoiets doet moet je jezelf al afvragen waar je mee bezig bent.Guillome schreef op vrijdag 26 maart 2010 @ 09:43:
Ik doe het dubbel omdat pconnect soms geen verbinding kan maken (bij herhaaldelijk op F5 bijv.).
Waarom heb je eigenlijk de connect vervangen door een pconnect? Heb je er een goede reden voor? Zat je met efficiëntie-problemen? Zit er een grote overhead in het opzetten van een connectie? Een te hoge belasting op de server door het databasegebruik? Zo nee: terug naar connect.
Ik vond het ook niet een nette oplossing, en vraag daarom ook de voor- en nadelen van pconnect.
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Het is waarschijnlijker dat je ergens een persistente connectie open hebt staan die iets aan het doen is, en in het midden daarvan wordt onderbroken (script timeout bijv.) en daardoor een tabel beschadigd.
Of je filesystem heeft problemen.
De laatste keer dat ik met MSSQL+PHP heb gewerkt is alweer een paar jaar geleden, maar toen was MS bezig met een eigen driver voor PHP: http://blogs.msdn.com/sqlphp/.
Ik weet niet precies wat de reden erachter was, volgens mij meer features, maar misschien is het goed om daar eens naar te kijken.
Het is niet stom om te proberen meerdere malen een connectie te maken, want het kan prima zijn dat een server een connectie weigert omdat 'ie te druk is. Wacht dan wel even tussen het maken van verbindingen en doe dit slechts als tijdelijke maatregel (probeer de oorzaak te vinden en op te lossen).
Kijkend naar je code: als je eerste pconnect goed gaat maar je mssql_select_db fout, dan ga je een niet-persistente connectie opzetten, een selectdb en daarna weer een pconnect. Wat is de logica daarachter??
Ikzelf zou dit een stuk logischer vinden:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| <?php $conn = false; $i=0; while (!is_resource($conn) && $i<3) { $i++; usleep(100); $conn = mssql_pconnect(); } if (!is_resource($conn)) { die('Kon geen verbinding maken'); } // Nu pas database selecteren ?> |
Ik denk dat het dan interessanter is om uit te zoeken waarom je 2 pogingen moet wagen om überhaupt een verbinding te krijgen. Dáár zit namelijk je probleem, niet in je PHP-code.Guillome schreef op vrijdag 26 maart 2010 @ 12:50:
Omdat het anders 2 keer zo`n 0.3 seconden duurt voordat de verbinding uberhaupt tot stand is gekomen. Met pconnect is dat vele malen sneller. Puur voor snelheidswinst.
Ik vond het ook niet een nette oplossing, en vraag daarom ook de voor- en nadelen van pconnect.
Maar zou dat ook verklaren waardoor z'n enterprise manager een timeout krijgt?djexplo schreef op vrijdag 26 maart 2010 @ 12:38:
Het geen verbinding krijgen van mssql_pconnect komt door:
[...]
@CptChaos: meestal gaat ie bij 1 poging al goed hoor. Soms echter niet. Ik ga `t eens onderzoeken
Edit:
Bram, het vastlopen van Enterprice manager is bij de corrupte tabellen. Dat is waar dit topic over ging.
Waar het nu over gaat is waarom ik een dubbele heb, en dat is omdat pconnect soms niet verbind. Hetgeen jij quote gaat daar over
[ Voor 32% gewijzigd door Guillome op 26-03-2010 13:01 ]
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Als die pconnect de verbinding openhoudt en de MSSQL server z'n max aantal verbindingen heeft bereikt: jaBram® schreef op vrijdag 26 maart 2010 @ 12:58:
[...]
Maar zou dat ook verklaren waardoor z'n enterprise manager een timeout krijgt?
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
1
| mssql.max_procs Unlimited Unlimited |
Phpinfo()...
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Ok, en het maximum aantal connecties dat MSSQL zelf toestaat is hoeveel?Guillome schreef op vrijdag 26 maart 2010 @ 13:04:
code:
1 mssql.max_procs Unlimited Unlimited
Phpinfo()...
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Sorry, ik had je code niet goed gelezen en niet gezien dat je naar twee verschillende databases probeert te connecten
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Je kan problemen krijgen bij het benaderen indien de tabellen exclusief gelocked zijn.
probeer eens exec sp_who of exec sp_who2 (sql2000? query analyzer) of het current activity overzicht in de sql ent manager. kolom 'blocked' toont de spid van de veroorzaker. evt commando 'kill' om die sessie te annuleren.
Ik zal eens proberen wat je zegt
Edit: omg.... denk dat je gelijk hebt. Nu doen ze het weer
Vanaf gister tot vandaag waren ze onbereikbaar. Rare zaak. Komt dit mogelijk door pconnect?
[ Voor 40% gewijzigd door Guillome op 26-03-2010 14:54 ]
If then else matters! - I5 12600KF, Asus Tuf GT501, Asus Tuf OC 3080, Asus Tuf Gaming H670 Pro, 48GB, Corsair RM850X PSU, SN850 1TB, Arctic Liquid Freezer 280, ASUS RT-AX1800U router
Je zal een locking conflict gehad hebben. Een standaard dead-lock situatie zal door de server doorbroken worden maar vaak gebeurt er meer waardoor de sqlserver het niet afkapt. (live-lock bv)
Of het door de connect library komt is moeilijk te zeggen. Misschien andere defaults voor de time-out?
Andere locking strategie geforceerd door de library?
Je kan het met de current activity af en toe bekijken hoe het gaat. Het SQL dashboard kan ik aanraden maar ik weet zo niet of die ook op sql2000 werkt. (sql2005 wel, 2008 heeft iets ingebouwd maar niet zo mooi)
Je kan misschien eens op een test systeem met de SQL tracer/SQL profiler kijken hoe een connect van de verschillende libraries gedaan wordt.