Minulla tuli tälläinen viesti kun yritin yhdistää php koodeihini jotka ovat ehostin serverillä.
SQLSTATE[42000] [1203] User freerol1_hello already has more than 'max_user_connections' active connections
Mitä tämä tarkoittaa? Luin jostain että se liittyisi jotenkin siihen että koodissani on liikaa sql kutsuja ja saattaisin päästä pois errorista kun käyttäisin komentoa mysql_close(); ja mysql_refresh(); En kuitenkaan ymmärrä miten niitä käytetään joten voisiko joku mahdollisimman pian vastata. Alla viellä yhden php koodini metodi:
function WinnerPosition($yhteys){ global $tableXCards; $kysely = $yhteys->prepare("SELECT card FROM $tableXCards WHERE id = ?"); $kysely->execute(array("winner")); $tulos = $kysely->fetch(PDO::FETCH_OBJ); $winners; foreach($tulos as $winners){} $winnerList = explode(";", $winners); echo "winner:"; foreach($winnerList as $winner){ echo "$winner:"; } }
Lisäys: Viellä lisäksenä että koodini hakee vähän yli puolet sql kutsuista ja sen jälkeen tulostaa errorin.
Lisäys: Nyt tutustuin asiaan enemmän ja huomasin että se onkin joku shared hostingin asettama raja. Onko kellään mitään ideoita miten sitä muuttaa. Luin jotain juttuja englanniksi mutta minusta niissä oli joitain aukkoja joten jos joku viitsisi kirjoittaa kokeillun ohjeen niin olisin kiitollinen.
Taitaa riippua webhotellin tarjoajasta tämä asia, miten monta yhtäaikaista yhteyttä tietokantaan sallitaan.
Saatttaa olla palvelutarjoajan virhe. Stackoverflow:a on hiukan tarinaa
Muutoin kyselysi pitäisi kaiken järjen mukaan palauttaa yksiselitteinen voittaja tai korkeintaan taulukollinen voittajia, mutta tulosjoukon käsittely on toteutettu jotenkin oudosti. Missä vaiheessa voittajat yhdistetään yhdeksi merkkijonoksi?
Kokeilin muutamaa overstackin vastausta ja paras oli tämä
SET GLOBAL max_user_connections = 0;
Kun tuon muuttaa nollaksi joku väitti että sql kutsuja saa tehdä loputtomasti. Ongelmana tuli kuitenkin että se ei toteuttanut käskyä vaan tulosti
Access denied; you need (at least one of) the SUPER privilege(s) for this operation
Onko kellään ideoita että miten saisin oikeuden tai voisinko jotenkin ohittaa tämän. Yritin ottaa yhteyttä ehostin apuun mutta siellä joku intialainen ei oikein ymmärtänyt ongelmaani.
Keskustelin uudelleen shared hosting palvelun ylläpitäjien kanssa ja he sanoivat että max user connections on 25 eikä sitä saa suuremmaksi. Luin hieman (mutta en ymmärtänyt) että sql kutsu pitäisi jotenkin sulkea tai jotain. Onko jollain antaa esimerkki koodia miten sql kutsuja ei tule yhden koodin aikana yli 25.
Tietokantayhteys sulkeutuu automaattisesti sivupyynnön lopussa, jos et erikseen tee siitä pysyvää (persistent) eikä palvelimessa ole jotain kummallista vikaa.
Kysymys ei ole ”yhden koodin aikana” tulevista yhteyksistä vaan kaikista tietokantayhteyksistä. On noin neljä vaihtoehtoa:
Turha valittaa myöskään, että intialainen ei ymmärrä ongelmaasi, kun selvästi et edes itse ymmärrä kunnolla ongelmaasi etkä erota MySQL-yhteyttä ja MySQL-kyselyä ja puhut jostain "sql kutsusta", joka ei nyt varmasti ole oikea termi.
Kiitos kattavasta vastauksesta. Nyt kun kävin vaihtoehdot läpi niin ainakaan 2 ja 3 se ei ole. Ja kun otin yhteyttä olisi luullut että he olisivat huomanneet jos siellä on jotain ongelmaa joten vaihtoehto 4 ei ole mahdollinen. Ainoaksi vaihtoehdoksi jää 1 joka on kuitenkin epätodennäköinen. Se on jännä juttu että kun menen koodiin selaimella tulostuksessa ei mainita virhettä mutta se ei kuitenkaan tulosta kaikkea. Unityllä taas se tulostaa samaan kohtaan jonka jälkeen siinä lukee error. Tätä ongelmaa ei ollut keskiviikkona mutta kun lisäsin koodiin muutaman pienen function joissa on sql-kysely niin ongelma tuli. Näitä functioita selain juuri ei tulosta ja error viesti tulee. Voisiko olla mahdollista että juuri nämä kaksi functiota olisi täyttänyt kyselyiden määrän vai voisiko niissä olla jokin virhe jota selain ei jostainsyystä tulosta?
Lisäys:
Tämä on todella mystinen juttu koska kokeilin poistaa uusimmat jutut koodistani ja se ei silti toiminut. Sen jälkeen tein uuden käyttäjän mutta se ei silti toiminut. Osaako joku sanoa mitä tehdä?
Kokeilin viellä muita koodejani ja ne toimivat normaalisti. Pitäisikö minun koodata koko koodi uudestaan vai voisiko jotain viellä yrittää.
Jos minulla olisi vastaava ongelma enkä millään keksisi mikä koodissaon vikana, niin kokeilisin varmaan ajaa systeemiä omalla palvelimella (esim. omalla koneella) ja katsoa montako samanaikaista yhteyttä muodostuu ja jos niitä tulee enemmän kuin oletettu, niin sitten voisi helpommin selvittää mistä johtuu erilaisilla debugtyökaluilla.
Käytän xappia joten näkeekö siitä jotenkin kuinka monta yhteyttä on käytössä? Olisiko viisasta tehdä koko koodista kommentti ja yksi functio kerralla kokeilla koska ongelma ilmenee. Tuo debug työkalu juttu kuulostaa hyvältä mutta minulla ei ole kokemusta. Jos viitsisit laittaa linkin niin olisin kiitollinen.
E1ss kirjoitti:
Käytän xappia joten näkeekö siitä jotenkin kuinka monta yhteyttä on käytössä?
Xapp ei ole itselle ennestään tuttu, mutta yleisesti ottaen MySQL:ltä voi kysyä
http://stackoverflow.com/questions/1620662/mysql-see-all-open-connections-to-a-given-database
Kiitos grez
Jos kerran osa sivusta tulostuu, on aika helppo nähdä, mihin tulostus loppuu, ja voit sitten etsiä koodista vastaavan kohdan. Siinä kohdassa varmaan yrität luoda uuden tietokantayhteyden (new PDO), koska muutenhan virhettä ei voi tapahtua. Jos se ei ole ensimmäinen tietokantaa käyttävä kohta koodissasi, kyseessä on mainitsemani virhe 2, eli luot itse liikaa tietokantayhteyksiä samassa koodissa.
Tuo kyseinen winnerPosition functio on se jonka jälkeen mitään ei tulostu. En näe ainakaan mitään virheitä mutta kokeilen muuttaa hieman C# koodiani jossa saattaisi olla virhe.
Lisäys: En löytänyt virhettä C# koodista joten en tiedä mitä tehdä.
Lisäys: NYT SAIN TOIMIMAAN!!! Tietokannastani puuttui yksi tieto joka jostain syystä aiheutti tälläisen ongelman. Kiitos kaikille vastauksista.
E1ss kirjoitti:
Se on jännä juttu että kun menen koodiin selaimella tulostuksessa ei mainita virhettä mutta se ei kuitenkaan tulosta kaikkea.
Se on ihan normaali juttu, ei jännä juttu. Tuotantopalvelimet pääsääntöisesti piilottavat virheet, koska ne voivat sisältää salasanoja, tiedostopolkuja tai konffeja tai muuta tietoa, jota ei haluta paljastaa kenelle tahansa vierailijalle. Voit laittaa oma-aloitteisesti virheiden näytön päälle ja mahdollisesti ne ovat myös luettavissa palvelimen lokeissa, jos sinulla on sinne pääsyä.
Nyt minulla tulee taas ongelmaa mutta oudointa tässä on se että ongelman tullessa koodissa sammutan koodin suorituksen ja yritän minuutin päästä uudelleen. Nyt koodi joka ennen toimi aiheuttaa max users connection ongelman ja kun odotan yli 5 min koodi toimii taas. Jääkö servereille jokin pyörimään pariksi minuutiksi jonka takia oikeat koodit eivät toimi huonon koodin luvun jälkeen?
Jos koodissasi on sopivanlainen bugi (esim. ikuinen silmukka tai pitkä sleep-komento tms.), koodi jumittaa palvelimella siihen asti, että palvelin sammuttaa sen esimerkiksi liian pitkän suoritusajan takia. Et voi selaimesta luotettavasti pysäyttää PHP-skriptiä. Punaisen rastin painaminen ei välttämättä pysäytä koodia.
Suunnittele PHP-koodisi niin, että se suoritetaan kerralla ja sivunlataus on varmasti ”heti” valmis. Ei kannata laittaa koodiin mitään uudelleen yrittämisen silmukoita tai odotuksia, jos ei ole ihan tarkkaan tiedossa, miten ne toimivat.
Aihe on jo aika vanha, joten et voi enää vastata siihen.