{"id":79893,"date":"2020-05-01T13:43:12","date_gmt":"2020-05-01T11:43:12","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov"},"modified":"2020-05-01T13:43:12","modified_gmt":"2020-05-01T11:43:12","slug":"postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","title":{"rendered":"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Juaj t\u00eb njiheni me interpretimin e raportit t\u00eb fillimit t\u00eb vitit 2016 t\u00eb Vladimir Sitnikovit \"PostgreSQL dhe JDBC, nxjerrim gjith\u00eb l\u00ebngun\"<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/9d94c8a024bd2821e431c525aae0127d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/030666abda53aa388b1cb1d0c46a7524.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mir\u00ebdita! Emri im \u00ebsht\u00eb Vladimir Sitnikov. Punoj 10 vjet n\u00eb kompanin\u00eb NetCracker. Kryesisht merrem me performanc\u00ebn. \u00c7do gj\u00eb q\u00eb ka t\u00eb b\u00ebj\u00eb me Java, \u00e7do gj\u00eb q\u00eb ka t\u00eb b\u00ebj\u00eb me SQL \u2013 kjo \u00ebsht\u00eb ajo q\u00eb kam pasion. <\/p>\n<p><\/p>\n<p>Dhe sot do t'ju flas p\u00ebr at\u00eb q\u00eb na ndodhi n\u00eb kompani kur filluam t\u00eb p\u00ebrdornim PostgreSQL si server bazash t\u00eb dh\u00ebnash. Ne zakonisht punojm\u00eb me Java. Por ajo q\u00eb do t\u00eb flas sot, nuk lidhet vet\u00ebm me Java. Si\u00e7 ka treguar praktika, kjo ndodh edhe n\u00eb gjuh\u00eb t\u00eb tjera. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/b01a214d782c7e32797a6c6466457979.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne do t\u00eb flasim p\u00ebr:<\/p>\n<p><\/p>\n<ul>\n<li>selekcionin e t\u00eb dh\u00ebnave. <\/li>\n<li>Ruajtjen e t\u00eb dh\u00ebnave. <\/li>\n<li>Po ashtu p\u00ebr performanc\u00ebn. <\/li>\n<li>Dhe p\u00ebr pengesat q\u00eb jan\u00eb fshehur atje. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/57da0c6aa4bb62e1beb77160f5aee7e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t\u00eb fillojm\u00eb me nj\u00eb pyetje t\u00eb thjesht\u00eb. Ne zgjedhim nj\u00eb rresht nga tabela sipas \u00e7el\u00ebsit primar. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/d5fcb1172aef402a87064498bf8a5218.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Baza ndodhet n\u00eb t\u00eb nj\u00ebjtin host. Dhe gjith\u00eb ky proces z\u00eb 20 milisekonda.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/103b7f9736b82a3313491b2f0d2a5824.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K\u00ebto 20 milisekonda \u2013 jan\u00eb shum\u00eb. N\u00ebse keni 100 pyetje t\u00eb tilla, shpenzoni koh\u00eb n\u00eb sekonda p\u00ebr t\u00eb rrotulluar k\u00ebto k\u00ebrkesa, dmth, po e humbni koh\u00ebn pa nevoj\u00eb.<\/p>\n<p><\/p>\n<p>Ne nuk duam ta b\u00ebjm\u00eb k\u00ebt\u00eb dhe shikojm\u00eb se \u00e7far\u00eb na ofron baza p\u00ebr k\u00ebt\u00eb. Baza na ofron dy alternativa p\u00ebr ekzekutimin e k\u00ebrkesave. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/b467e86a0f8c4c32cea182fe27a28e6e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Alternativa e par\u00eb \u00ebsht\u00eb k\u00ebrkesa e thjesht\u00eb. \u00c7far\u00eb \u00ebsht\u00eb e mir\u00eb n\u00eb k\u00ebt\u00eb? Sepse ne e marrim dhe e d\u00ebrgojm\u00eb, dhe nuk b\u00ebjm\u00eb asgj\u00eb m\u00eb shum\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/7e333a62ba68feb0781ff96e39486591.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/478\">https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/478<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Baza ka gjithashtu nj\u00eb k\u00ebrkes\u00eb t\u00eb zgjeruar, e cila \u00ebsht\u00eb m\u00eb e men\u00e7ur, por m\u00eb funksionale. Mund t\u00eb d\u00ebrgoni ve\u00e7mas k\u00ebrkesa p\u00ebr analiz\u00eb, ekzekutim, lidhjen e variablave, etj. <\/p>\n<p><\/p>\n<p>Super extended query \u2013 \u00ebsht\u00eb ajo q\u00eb ne nuk do ta mbulojm\u00eb n\u00eb k\u00ebt\u00eb raport. Ndoshta kemi disa d\u00ebshira nga baza e t\u00eb dh\u00ebnave dhe ekziston nj\u00eb list\u00eb d\u00ebshirash e formuar n\u00eb nj\u00ebfar\u00eb forme, dmth, kjo \u00ebsht\u00eb ajo q\u00eb ne d\u00ebshirojm\u00eb, por nuk \u00ebsht\u00eb e mundur tani dhe n\u00eb vitin e ardhsh\u00ebm. Prandaj, thjesht e shkruam dhe do t\u00eb shkojm\u00eb t\u00eb trondisim njer\u00ebzit kryesor\u00eb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/19094729074fd28c5b9f236833a9a266.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ajo q\u00eb mund t\u00eb b\u00ebjm\u00eb \u00ebsht\u00eb k\u00ebrkesa e thjesht\u00eb dhe k\u00ebrkesa e zgjeruar.<\/p>\n<p><\/p>\n<p>Cila \u00ebsht\u00eb ve\u00e7oria e \u00e7do qasjeje? <\/p>\n<p><\/p>\n<p>K\u00ebrkesa e thjesht\u00eb \u00ebsht\u00eb e mir\u00eb p\u00ebr ekzekutimin nj\u00eb her\u00eb. E realizove nj\u00eb her\u00eb dhe e harrove. Problemi \u00ebsht\u00eb se ajo nuk mb\u00ebshtet formatin binar t\u00eb t\u00eb dh\u00ebnave, dmth, p\u00ebr disa sisteme me performanc\u00eb t\u00eb lart\u00eb, ajo nuk \u00ebsht\u00eb e p\u00ebrshtatshme.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/062c0e45cefd91ece331a306a7651bde.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K\u00ebrkesa e zgjeruar \u2013 lejon t\u00eb kursejm\u00eb koh\u00eb gjat\u00eb procesit t\u00eb parse-ing. Kjo \u00ebsht\u00eb ajo q\u00eb b\u00ebm\u00eb dhe filluam ta p\u00ebrdorim. Na ka ndihmuar jasht\u00ebzakonisht. Aty ka jo vet\u00ebm kursim n\u00eb parse-ing. Ka edhe kursim n\u00eb transmetimin e t\u00eb dh\u00ebnave. T\u00eb transmetosh t\u00eb dh\u00ebnat n\u00eb format binar \u00ebsht\u00eb shum\u00eb m\u00eb efikase. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/6df83a2f3736568668cf9d74de5d9758.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>T\u00eb kalojm\u00eb n\u00eb praktik\u00eb. K\u00ebtu \u00ebsht\u00eb si duket nj\u00eb aplikacion tipik. Mund t\u00eb jet\u00eb Java etj. <\/p>\n<p><\/p>\n<p>Krijuam nj\u00eb statement. E ekzekutuam komand\u00ebn. Krijuam nj\u00eb close. Ku \u00ebsht\u00eb gabimi k\u00ebtu? \u00c7far\u00eb \u00ebsht\u00eb problemi? Nuk ka probleme. K\u00ebshtu shkruhet n\u00eb t\u00eb gjitha librat. K\u00ebshtu duhet t\u00eb shkruhet. N\u00ebse doni maksimumin e performanc\u00ebs, shkruani k\u00ebshtu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/6923293946dec45b3fd508235728ab95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por praktika tregoi se kjo nuk funksionon. Pse? Sepse kemi metod\u00ebn \"close\". Dhe kur e b\u00ebjm\u00eb k\u00ebshtu, nga k\u00ebndv\u00ebshtrimi i baz\u00ebs s\u00eb t\u00eb dh\u00ebnave, kjo \u00ebsht\u00eb si puna e nj\u00eb duhanpir\u00ebsi me baz\u00ebn e t\u00eb dh\u00ebnave. Ne tham\u00eb \"PARSE EXECUTE DEALLOCATE\".<\/p>\n<p><\/p>\n<p>Pse k\u00ebto krijime dhe shkarkime t\u00eb tepruara t\u00eb statements? Askush nuk i nevojitet. Por zakonisht n\u00eb PreparedStatement ndodh q\u00eb kur i mbyllim, ato mbyllin gjith\u00e7ka n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave. Kjo nuk \u00ebsht\u00eb ajo q\u00eb duam. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/5a357a209e414024c437d042f600f251.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ne duam, si njer\u00ebz t\u00eb sh\u00ebndetsh\u00ebm, t\u00eb punojm\u00eb me baz\u00ebn. Nj\u00eb her\u00eb e mor\u00ebm dhe e p\u00ebrgatit\u00ebm statement-in ton\u00eb, pastaj e ekzekutojm\u00eb shum\u00eb her\u00eb. N\u00eb t\u00eb v\u00ebrtet\u00eb shum\u00eb her\u00eb \u2013 \u00ebsht\u00eb nj\u00eb her\u00eb p\u00ebr gjith\u00eb jet\u00ebn e aplikacionit q\u00eb e kemi parse. Dhe n\u00eb REST t\u00eb ndryshme p\u00ebrdorim t\u00eb nj\u00ebjtin statement id. Kjo \u00ebsht\u00eb q\u00ebllimi yn\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/ac4aed702a624ad9f9addc4362daf760.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si ta arrijm\u00eb k\u00ebt\u00eb? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/0f101d890d1a2af8e99f8a3a8a06fd5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Shum\u00eb thjesht\u00eb \u2013 nuk duhet t\u00eb mbyllim statements. Shkruajm\u00eb k\u00ebshtu: \"prepare\" \"execute\". <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/0b3fd8fd4f5861d4a76cad5a8421ddad.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/724646bfc55b5e2b611b1584ca8ba6aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00ebse e ekzekutojm\u00eb k\u00ebt\u00eb, \u00ebsht\u00eb e qart\u00eb se diku do t\u00eb mbushet. N\u00ebse nuk \u00ebsht\u00eb e qart\u00eb, mund t\u00eb matim. Merrni dhe shkruani nj\u00eb benchmark, ku \u00ebsht\u00eb nj\u00eb metod\u00eb e till\u00eb e thjesht\u00eb. Krijojm\u00eb nj\u00eb statement. E ekzekutojm\u00eb n\u00eb ndonj\u00eb version t\u00eb driver-it dhe kuptojm\u00eb se ai rr\u00ebzohet mjaft shpejt me humbjen e t\u00eb gjith\u00eb memories q\u00eb kemi sjell\u00eb. <\/p>\n<p><\/p>\n<p>E qart\u00eb se k\u00ebto gabime jan\u00eb leht\u00ebsisht t\u00eb korrigjueshme. Nuk do t\u00eb flas p\u00ebr to. Por do t\u00eb them se n\u00eb versionin e ri punon shum\u00eb m\u00eb shpejt. Metoda \u00ebsht\u00eb e pavlefshme, por megjithat\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/b232a6205e708c70f52be0024bbe9980.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Si t\u00eb punojm\u00eb si duhet? \u00c7far\u00eb duhet t\u00eb b\u00ebjm\u00eb p\u00ebr k\u00ebt\u00eb?<\/p>\n<p><\/p>\n<p>N\u00eb realitet, aplikacionet gjithmon\u00eb mbyllin statements. N\u00eb t\u00eb gjitha librat shkruhen q\u00eb duhet mbyllur, n\u00eb t\u00eb kund\u00ebrt do t\u00eb ket\u00eb rrjedhje t\u00eb memories. <\/p>\n<p><\/p>\n<p>Dhe PostgreSQL nuk di t\u00eb cache-oj\u00eb k\u00ebrkesat. Duhet q\u00eb \u00e7do sesion t\u00eb krijoj\u00eb vet\u00eb k\u00ebt\u00eb cache. <\/p>\n<p><\/p>\n<p>Dhe nuk duam t\u00eb kalojm\u00eb koh\u00eb n\u00eb parse-ing gjithashtu. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/85b9574938aa6e6bf59c956e3728bdc3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe si zakonisht kemi dy mund\u00ebsi. <\/p>\n<p><\/p>\n<p>Opsioni i par\u00eb \u2013 ne marrim dhe themi, le t\u00eb konvertojm\u00eb gjith\u00e7ka n\u00eb PgSQL. Aty ka cache. Ai gjith\u00e7ka e cache. Do t\u00eb del shk\u00eblqyer. Ne e shikuam k\u00ebt\u00eb. Kemi 100500 k\u00ebrkesa. Nuk funksionon. Nuk jemi dakord \u2013 t\u00eb transformojm\u00eb k\u00ebrkesat n\u00eb procedura me dor\u00eb. Jo jo. <\/p>\n<p><\/p>\n<p>Kemi nj\u00eb opsion t\u00eb dyt\u00eb \u2013 t\u00eb marrim dhe ta b\u00ebjm\u00eb vet\u00eb. Hapim kodin burimor, fillojm\u00eb t\u00eb punojm\u00eb. Punohet-punohet. Doli se nuk \u00ebsht\u00eb aq e v\u00ebshtir\u00eb ta b\u00ebsh. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/501620b014800406167d20668baef709.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/319\">https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/319<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Kjo u shfaq n\u00eb gusht 2015. Tani kemi nj\u00eb version m\u00eb modern. Dhe gjith\u00e7ka \u00ebsht\u00eb shk\u00eblqyer. Funksionon kaq mir\u00eb, saq\u00eb nuk b\u00ebjm\u00eb asnj\u00eb ndryshim n\u00eb aplikacion. Madje kemi ndaluar s\u00eb menduari p\u00ebr PgSQL, dmth na mjafton kjo p\u00ebr t\u00eb ulur praktiksht t\u00eb gjitha shpenzimet. <\/p>\n<p><\/p>\n<p>P\u00ebrkat\u00ebsisht, Server-prepared statements aktivizohet n\u00eb ekzekutimin e pest\u00eb p\u00ebr t\u00eb mos shpenzuar memorie n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave p\u00ebr \u00e7do k\u00ebrkes\u00eb nj\u00ebherore. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/8ee95e71f92187941989ad0c18ece0c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mund t\u00eb pyesni \u2013 ku jan\u00eb numrat? \u00c7far\u00eb po merrni? Dhe k\u00ebtu nuk mund t\u00eb jap numra, sepse p\u00ebr \u00e7do k\u00ebrkes\u00eb, ata jan\u00eb t\u00eb ndrysh\u00ebm.<\/p>\n<p><\/p>\n<p>K\u00ebrkesat tona ishin t\u00eb tilla q\u00eb ne n\u00eb k\u00ebrkesat OLTP shpenzonim diku 20 milisekonda p\u00ebr parsing. Kishte 0,5 milisekonda p\u00ebr ekzekutim, 20 milisekonda p\u00ebr parsing. K\u00ebrkesa \u2013 10 KiB tekst, 170 rreshta plani. Kjo \u00ebsht\u00eb nj\u00eb k\u00ebrkes\u00eb OLTP. Ajo k\u00ebrkon 1, 5, 10 rreshta, ndonj\u00ebher\u00eb m\u00eb shum\u00eb. <\/p>\n<p><\/p>\n<p>Por ne nuk donim t\u00eb shpenzonim 20 milisekonda. Ne e kemi ulur at\u00eb n\u00eb 0. Gjith\u00e7ka \u00ebsht\u00eb shk\u00eblqyer. <\/p>\n<p><\/p>\n<p>\u00c7far\u00eb mund t\u00eb nxirrni prej k\u00ebtu? Nese keni Java, at\u00ebher\u00eb merrni versionin modern t\u00eb driver-it dhe g\u00ebzohuni. <\/p>\n<p><\/p>\n<p>N\u00ebse keni ndonj\u00eb gjuh\u00eb tjet\u00ebr, at\u00ebher\u00eb mendoni \u2013 ndoshta kjo ju nevojitet gjithashtu? Sepse nga pik\u00ebpamja e gjuh\u00ebs p\u00ebrfundimtare, p\u00ebr shembull, n\u00ebse \u00ebsht\u00eb PL 8 ose n\u00ebse keni LibPQ, nuk \u00ebsht\u00eb e qart\u00eb se po humbni koh\u00eb jo p\u00ebr ekzekutim, por p\u00ebr parsing dhe kjo ia vlen ta verifikoni. Si? T\u00eb gjitha jan\u00eb falas. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/fda6b1c1b126cb85c970e42335e1dc24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>P\u00ebrve\u00e7 faktit q\u00eb ka gabime, disa ve\u00e7ori. Dhe p\u00ebr to do t\u00eb flasim tani. Pjesa m\u00eb e madhe do t\u00eb jet\u00eb p\u00ebr arkeologjin\u00eb industris\u00eb, p\u00ebr at\u00eb q\u00eb kemi gjetur, p\u00ebr \u00e7far\u00eb na \u00ebsht\u00eb ndodhur. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/9a3b383f83c5e227cd02952c5825b64f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00ebse k\u00ebrkesa gjenerohet dinamike. Kjo ndodh. Disa bashkangjisin vargje, k\u00ebshtu q\u00eb del nj\u00eb k\u00ebrkes\u00eb SQL.<\/p>\n<p><\/p>\n<p>\u00c7far\u00eb \u00ebsht\u00eb e keqe me t\u00eb? \u00cbsht\u00eb e keqe sepse \u00e7do her\u00eb kemi n\u00eb fund nj\u00eb varg t\u00eb ndrysh\u00ebm.<\/p>\n<p><\/p>\n<p>Dhe duhet ri-t\u00eb llogarisni hashCode p\u00ebr k\u00ebt\u00eb varg t\u00eb ndrysh\u00ebm. Kjo \u00ebsht\u00eb v\u00ebrtet nj\u00eb detyr\u00eb CPU \u2013 t\u00eb gjeni tekstin e gjat\u00eb t\u00eb k\u00ebrkes\u00ebs n\u00eb nj\u00eb hash ekzistues nuk \u00ebsht\u00eb aq e leht\u00eb. Prandaj, p\u00ebrfundimi \u00ebsht\u00eb i thjesht\u00eb \u2013 mos gjeneroni k\u00ebrkesa. Ruani ato n\u00eb nj\u00eb variab\u00ebl t\u00eb vetme. Dhe g\u00ebzohuni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/bcd4f729204cecdb572a98f357bcc33f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Problemi tjet\u00ebr. Llojet e t\u00eb dh\u00ebnave jan\u00eb t\u00eb r\u00ebnd\u00ebsishme. Ka ORM q\u00eb thon\u00eb se nuk ka r\u00ebnd\u00ebsi cili NULL, le t\u00eb jet\u00eb ndonj\u00ebher\u00eb. N\u00ebse \u00ebsht\u00eb Int, at\u00ebher\u00eb ne themi setInt. Nd\u00ebrsa n\u00ebse \u00ebsht\u00eb NULL, le t\u00eb jet\u00eb gjithmon\u00eb VARCHAR. Dhe \u00e7far\u00eb r\u00ebnd\u00ebsie ka n\u00eb fund t\u00eb fundit cili atje \u00ebsht\u00eb NULL? Baza e t\u00eb dh\u00ebnave do ta kuptoj\u00eb gjith\u00e7ka vet\u00eb. Dhe kjo skic\u00eb nuk funksionon. <\/p>\n<p><\/p>\n<p>N\u00eb praktik\u00eb, baza e t\u00eb dh\u00ebnave nuk i bie fare n\u00eb sy kjo. <strong>N\u00ebse her\u00ebn e par\u00eb that\u00eb se \u00ebsht\u00eb num\u00ebr, dhe her\u00ebn e dyt\u00eb that\u00eb se \u00ebsht\u00eb VARCHAR, at\u00ebher\u00eb \u00ebsht\u00eb e pamundur t\u00eb ri-p\u00ebrdorni deklaratat e p\u00ebrgatitura nga serveri. Dhe n\u00eb k\u00ebt\u00eb rast, duhet t\u00eb krijoni nga e para deklarat\u00ebn ton\u00eb.<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/552d9c2e25cf9abbdfef12c98d027740.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00ebse po ekzekutoni t\u00eb nj\u00ebjt\u00ebn k\u00ebrkes\u00eb, at\u00ebher\u00eb q\u00ebndroni t\u00eb sigurt p\u00ebr t\u00eb mos ngat\u00ebrruar llojet e t\u00eb dh\u00ebnave n\u00eb kolon\u00ebn tuaj. Duhet t\u00eb monitoroni NULL. Kjo \u00ebsht\u00eb nj\u00eb gabim i zakonsh\u00ebm q\u00eb kemi pasur pas fillimit t\u00eb p\u00ebrdorimit t\u00eb PreparedStatements.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/5d73c8f5dfa281c3bda962fc3e5edd84.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mir\u00eb, e aktivizuam. Mor\u00ebm, ndoshta, drejtuesin. Dhe performanca ra. \u00c7do gj\u00eb u b\u00eb keq. <\/p>\n<p><\/p>\n<p>Si ndodh kjo? \u00cbsht\u00eb nj\u00eb gabim apo nj\u00eb karakteristik\u00eb? Fatkeq\u00ebsisht, nuk arrit\u00ebm t\u00eb kuptojm\u00eb \u2013 \u00ebsht\u00eb nj\u00eb gabim apo nj\u00eb karakteristik\u00eb. Por ka nj\u00eb skenar t\u00eb thjesht\u00eb p\u00ebr t\u00eb p\u00ebrs\u00ebritur k\u00ebt\u00eb problem. Ai na ka p\u00ebrndjekur krejt papritur. Dhe p\u00ebrfshin marrjen e t\u00eb dh\u00ebnave vet\u00ebm nga nj\u00eb tabel\u00eb. Sigurisht, na ka pasur edhe k\u00ebrkesa t\u00eb tjera. Ato zakonisht p\u00ebrfshinin dy-tre tabela, por ka nj\u00eb skenar t\u00eb till\u00eb p\u00ebr t\u00eb p\u00ebrs\u00ebritur. Merrni ndonj\u00eb version t\u00eb baz\u00ebs suaj dhe e p\u00ebrs\u00ebrisni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/fa0fdd037c2eaa31667d5a527bb71f9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1\">https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Kuptimi \u00ebsht\u00eb se kemi dy kolona, \u200b\u200bsecila prej tyre e indeksuar. N\u00eb nj\u00eb kolon\u00eb ka nj\u00eb milion rreshta me vler\u00eb NULL. Nd\u00ebrsa n\u00eb kolon\u00ebn tjet\u00ebr ndodhen vet\u00ebm 20 rreshta. Kur e ekzekutojm\u00eb pa variabla t\u00eb lidhura, \u00e7do gj\u00eb funksionon mir\u00eb. <\/p>\n<p><\/p>\n<p>N\u00ebse fillojm\u00eb t\u00eb ekzekutojm\u00eb me variabla t\u00eb lidhura, dometh\u00ebn\u00eb, ne ekzekutojm\u00eb shenj\u00ebn \"?\" ose \"$1\" p\u00ebr k\u00ebrkes\u00ebn ton\u00eb, at\u00ebher\u00eb \u00e7far\u00eb marrim p\u00ebrfundimisht?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/e91c397796c7ddcbade3bc090719e9d1.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1\">https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Ekzekutimi i par\u00eb \u2013 si\u00e7 \u00ebsht\u00eb e duhura. I dyti \u2013 pak m\u00eb i shpejt\u00eb. Disa shkalla u shp\u00ebtuar. I treti-kat\u00ebrti-pest\u00eb. Pastaj ndodhi - dhe filloi k\u00ebshtu. Dhe m\u00eb e keqja, \u00ebsht\u00eb se ndodh n\u00eb ekzekutimin e gjasht\u00eb. Kush e dinte se duhet t\u00eb b\u00ebjm\u00eb pik\u00ebrisht gjasht\u00eb ekzekutime p\u00ebr t\u00eb kuptuar se cili \u00ebsht\u00eb plani i shkak t\u00eb v\u00ebrtet\u00eb?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/893c955bc1e2e15a6986690e516f72a9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kush faji? \u00c7far\u00eb ndodhi? Baza e t\u00eb dh\u00ebnave p\u00ebrmban optimizim. Dhe ajo \u00ebsht\u00eb si optimizuar p\u00ebr rastin generic. Dhe, p\u00ebrkat\u00ebsisht, duke filluar nga nj\u00eb moment, ajo kalon n\u00eb planin generic, i cili, fatkeq\u00ebsisht, mund t\u00eb rezultoj\u00eb t\u00eb jet\u00eb ndryshe. Ai mund t\u00eb mbetet i nj\u00ebjt\u00eb, por gjithashtu mund t\u00eb jet\u00eb ndryshe. Dhe ka nj\u00eb vler\u00eb pragore, q\u00eb \u00e7on n\u00eb k\u00ebt\u00eb sjellje. <\/p>\n<p><\/p>\n<p>\u00c7far\u00eb mund t\u00eb b\u00ebjm\u00eb me k\u00ebt\u00eb? K\u00ebtu, sigurisht, \u00ebsht\u00eb m\u00eb e komplikuar t\u00eb parashikohet. Ka nj\u00eb zgjidhje t\u00eb thjesht\u00eb q\u00eb ne p\u00ebrdorim. Kjo \u00ebsht\u00eb +0, OFFSET 0. Sigurisht q\u00eb ju i dini k\u00ebto zgjidhje. Thjesht e marrim dhe e shtojm\u00eb '+0' n\u00eb k\u00ebrkes\u00eb dhe gjith\u00e7ka shkon mir\u00eb. Do e tregoj m\u00eb von\u00eb. <\/p>\n<p><\/p>\n<p>Dhe ka nj\u00eb tjet\u00ebr variant \u2013 t\u00eb shikoni m\u00eb me kujdes planet. Zhvilluesi duhet t\u00eb shkruaj\u00eb jo vet\u00ebm k\u00ebrkes\u00ebn, por edhe t\u00eb thot\u00eb 'explain analyze' 6 her\u00eb. N\u00ebse thot\u00eb 5, at\u00ebher\u00eb nuk q\u00ebndron. <\/p>\n<p><\/p>\n<p>Dhe ka edhe nj\u00eb variant t\u00eb tret\u00eb \u2013 t\u00eb shkruajm\u00eb nj\u00eb let\u00ebr n\u00eb pgsql-hackers. E kam b\u00ebr\u00eb, megjithat\u00eb, ende nuk \u00ebsht\u00eb e qart\u00eb \u2013 \u00ebsht\u00eb nj\u00eb gabim apo nj\u00eb karakteristik\u00eb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/8dc8d3a78e0b794e1ceba20f6ca914ae.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1\">https:\/\/gist.github.com\/vlsi\/df08cbef370b2e86a5c1<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Nd\u00ebrkoh\u00eb q\u00eb mendojm\u00eb \u2013 a \u00ebsht\u00eb nj\u00eb gabim apo nj\u00eb karakteristik\u00eb, le t\u00eb e rregullojm\u00eb. Do e marrim k\u00ebrkes\u00ebn ton\u00eb dhe do i shtojm\u00eb '+0'. Gjith\u00e7ka shkon mir\u00eb. Dy simbole dhe nuk duhet t\u00eb mendojm\u00eb se si \u00ebsht\u00eb. Shum\u00eb e thjesht\u00eb. Ne thjesht e ndaluam baz\u00ebn e t\u00eb dh\u00ebnave q\u00eb t\u00eb p\u00ebrdor\u00eb indeksin p\u00ebr k\u00ebt\u00eb kolon\u00eb. Nuk kemi indeks p\u00ebr kolon\u00ebn '+0' dhe gjith\u00e7ka shkon mir\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/5261d80d084786a15b9764f6367014cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ky \u00ebsht\u00eb rregulli i 6 explain\u2019\u00ebve. Tani n\u00eb versionet aktuale duhet t\u00eb b\u00ebjm\u00eb 6 her\u00eb, n\u00ebse keni variabla t\u00eb lidhura. N\u00ebse nuk keni variabla t\u00eb lidhura, at\u00ebher\u00eb ne veprojm\u00eb k\u00ebshtu. Dhe n\u00eb fund, pik\u00ebrisht kjo k\u00ebrkes\u00eb bie. Nuk \u00ebsht\u00eb ndonj\u00eb gj\u00eb e komplikuar.<\/p>\n<p><\/p>\n<p>Si\u00e7 duket, sa mund t\u00eb ndodhin? Ka nj\u00eb gabim k\u00ebtu, nj\u00eb gabim atje. Realisht ka gabim gjithandej. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/674dc7e7b4624baa5c79eee9e1e89db0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t\u00eb shikojm\u00eb edhe nj\u00ebher\u00eb. P\u00ebr shembull, kemi dy skema. Schema A me tabel\u00ebn Y dhe schema B me tabel\u00ebn Y. K\u00ebrkesa \u00ebsht\u00eb \u2013 p\u00ebrzgjidh t\u00eb dh\u00ebnat nga tabela. \u00c7far\u00eb do t\u00eb ndodh\u00eb? Do t\u00eb kemi nj\u00eb gabim. Do t\u00eb kemi gjith\u00e7ka t\u00eb p\u00ebrmendur m\u00eb sip\u00ebr. Rregulli \u00ebsht\u00eb i till\u00eb \u2013 gabim n\u00eb \u00e7do vend, do t\u00eb kemi gjith\u00e7ka t\u00eb p\u00ebrmendur m\u00eb sip\u00ebr.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/dd6f544bb9e930c39e36523c9afe6003.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tani pyetja: 'Pse?'. Si\u00e7 duket, ka dokumentacion, q\u00eb thot\u00eb se, n\u00ebse kemi skem\u00eb, ekziston variabla 'search_path', e cila tregon se ku duhet t\u00eb k\u00ebrkohet tabela. Si\u00e7 duket, variabla ekziston.<\/p>\n<p><\/p>\n<p>Cila \u00ebsht\u00eb problemo? Problemi q\u00ebndron n\u00eb faktin se server-prepared statements nuk njoftojn\u00eb q\u00eb search_path mund t\u00eb ndryshohet nga dikush. Ky vler\u00eb mbetet si nj\u00eb konstant p\u00ebr baz\u00ebn e t\u00eb dh\u00ebnave. Dhe disa pjes\u00eb mund t\u00eb mos kapin vlerat e reja. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/f738301606d84d72bfa7cc5b568c0df8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Natyrisht, kjo varet nga versioni me t\u00eb cilin po testoni. Varet nga sa seriozisht ndryshojn\u00eb tabelat tuaja. Versioni 9.1 do t\u00eb ekzekutoj\u00eb thirrjet e vjetra. Versionet e reja mund t\u00eb zbulojn\u00eb mashtrimin dhe t\u00eb thon\u00eb se keni nj\u00eb gabim.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/4761cd92835b94acbf9d6c9d21817316.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/www.postgresql.org\/message-id\/CAB=Je-GQOW7kU9Hn3AqP1vhaZg_wE9Lz6F4jSp-7cm9_M6DyVA@mail.gmail.com\">Set search_path + deklaratat e p\u00ebrgatitura nga serveri =<br \/>\nplani i ruajtur nuk duhet t\u00eb ndryshoj\u00eb llojin e rezultatit<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Si ta trajtojm\u00eb k\u00ebt\u00eb? Ka nj\u00eb recet\u00eb t\u00eb thjesht\u00eb \u2013 mos e b\u00ebni k\u00ebshtu. Mos e ndryshoni search_path gjat\u00eb pun\u00ebs s\u00eb aplikacionit. N\u00ebse e ndryshoni, \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb krijoni nj\u00eb lidhje t\u00eb re.<\/p>\n<p><\/p>\n<p>Mund t\u00eb diskutojm\u00eb, dmth. t\u00eb hapim, t\u00eb diskutojm\u00eb, t\u00eb shkruajm\u00eb m\u00eb shum\u00eb. Ndoshta do t'i bindim zhvilluesit e baz\u00ebs s\u00eb t\u00eb dh\u00ebnave q\u00eb n\u00eb rast se dikush ndryshon vler\u00ebn, baza e t\u00eb dh\u00ebnave duhet ta informoj\u00eb klientin: \"Shikoni, k\u00ebtu ju \u00ebsht\u00eb rinovuar nj\u00eb vler\u00eb. Ndoshta duhet t\u00eb ri-inizoni deklaratat?\". Tani, baza e t\u00eb dh\u00ebnave vepron fshehuras dhe nuk njofton asgj\u00eb p\u00ebr ndryshimin e ndodhur brenda deklaratave. <\/p>\n<p><\/p>\n<p>Dhe p\u00ebrs\u00ebri do ta theksoj \u2013 kjo \u00ebsht\u00eb di\u00e7ka q\u00eb nuk \u00ebsht\u00eb tipike p\u00ebr Java. Ne do ta shohim t\u00eb nj\u00ebjt\u00ebn gj\u00eb n\u00eb PL\/pgSQL p\u00ebr nj\u00eb t\u00eb nj\u00ebjt\u00eb. Por aty do t\u00eb riprodhohet.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/a4e7b201d0c0aa4a0092d2b6ff152df7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t\u00eb provojm\u00eb t\u00eb zgjedhim t\u00eb dh\u00ebna p\u00ebrs\u00ebri. Po zgjedhim. Kemi nj\u00eb tabel\u00eb me nj\u00eb milion rreshta. Secili rresht nj\u00eb kilobajt. Af\u00ebrsisht nj\u00eb gigabajt t\u00eb dh\u00ebn\u00eb. Dhe kemi nj\u00eb kujtes\u00eb operative n\u00eb makin\u00ebn Java me 128 megabajt. <\/p>\n<p><\/p>\n<p>Ne, si\u00e7 rekomandohet n\u00eb t\u00eb gjitha librat, p\u00ebrdorim p\u00ebrpunimin n\u00eb rrjedh\u00eb. Dometh\u00ebn\u00eb, hapim resultSet dhe lexojm\u00eb t\u00eb dh\u00ebnat nga aty pak-pak. A do t\u00eb funksionoj\u00eb kjo? A do t\u00eb bjer\u00eb p\u00ebr shkak t\u00eb memories? A do t\u00eb lexoj\u00eb pak-pak? Le t\u00eb besojm\u00eb n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave, le t\u00eb besojm\u00eb n\u00eb Postgres. Nuk besojm\u00eb. A do t\u00eb bie OutOfMemory? Kush ka r\u00ebn\u00eb nga OutOfMemory? Dhe kush arriti ta riparoj\u00eb pas k\u00ebsaj? Disa arrit\u00ebn ta riparojn\u00eb. <\/p>\n<p><\/p>\n<p>N\u00ebse keni nj\u00eb milion rreshta, nuk mund t\u00eb zgjidhni thjesht ashtu. Duhet patjet\u00ebr OFFSET\/LIMIT. Kush \u00ebsht\u00eb p\u00ebr k\u00ebt\u00eb variant? Dhe kush \u00ebsht\u00eb p\u00ebr variantin q\u00eb duhet t\u00eb luajm\u00eb me autoCommit? <\/p>\n<p><\/p>\n<p>K\u00ebtu, si zakonisht, varianti m\u00eb befasues rezulton t\u00eb jet\u00eb i sakt\u00eb. Dhe n\u00ebse ndonj\u00ebher\u00eb e fikni autoCommit, do t\u00eb ndihmoj\u00eb. Pse k\u00ebshtu? Shkenca nuk e di k\u00ebt\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/2e5d9d2a8450a9069155de86a8ec387a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por n\u00eb m\u00ebnyr\u00eb standart, t\u00eb gjith\u00eb klient\u00ebt, q\u00eb lidhen me baz\u00ebn e t\u00eb dh\u00ebnave Postgres, zgjedhin t\u00eb dh\u00ebnat e plota. PgJDBC n\u00eb k\u00ebt\u00eb aspekt nuk \u00ebsht\u00eb p\u00ebrjashtim, zgjedh t\u00eb gjith\u00eb rreshtat.<\/p>\n<p><\/p>\n<p>Ka nj\u00eb variacion mbi tem\u00ebn FetchSize, dometh\u00ebn\u00eb, mund t\u00eb thuash n\u00eb nivelin e nj\u00eb deklarate t\u00eb ve\u00e7ant\u00eb se k\u00ebtu, ju lutem, zgjidhni t\u00eb dh\u00ebnat me 10, 50. Por kjo nuk funksionon derisa t\u00eb fikni autoCommit. E fik\u00ebt autoCommit \u2013 fillon t\u00eb funksionoj\u00eb. <\/p>\n<p><\/p>\n<p>Por t\u00eb ecur n\u00eb kod dhe p\u00ebr t\u00eb vendosur setFetchSize kudo \u00ebsht\u00eb e pak\u00ebndshme. Prandaj ne b\u00ebm\u00eb nj\u00eb konfigurim q\u00eb do t\u00eb thot\u00eb vlera e parazgjedhur p\u00ebr t\u00eb gjith\u00eb lidhjen.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/c9ac8e483dc6bfdbbc300972ee1ab1e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ja, ne e tham\u00eb k\u00ebt\u00eb. E konfiguram parametrin. Dhe \u00e7far\u00eb arrit\u00ebm? N\u00ebse zgjedhim pak, p\u00ebr shembull, 10 rreshta, at\u00ebher\u00eb kemi shpenzime shum\u00eb t\u00eb m\u00ebdha. Prandaj duhet ta vendosim k\u00ebt\u00eb vler\u00eb af\u00ebr nj\u00ebqind. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/073e7a4af63688396eefe332ba8261d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Idealisht, padyshim, do t\u00eb m\u00ebsojm\u00eb t\u00eb kufizojm\u00eb n\u00eb byte, por receta \u00ebsht\u00eb k\u00ebshtu: vendosim defaultRowFetchSize m\u00eb shum\u00eb se nj\u00ebqind dhe g\u00ebzohemi. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/e3078faf2078fcaec10d6d99872a9990.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le t\u00eb kalojm\u00eb n\u00eb futjen e t\u00eb dh\u00ebnave. Futja \u00ebsht\u00eb m\u00eb e leht\u00eb, ka variante t\u00eb ndryshme. P\u00ebr shembull, INSERT, VALUES. Ky \u00ebsht\u00eb nj\u00eb variant i mir\u00eb. Mund t\u00eb flasim p\u00ebr \"INSERT SELECT\". N\u00eb praktik\u00eb, \u00ebsht\u00eb t\u00eb nj\u00ebjt\u00ebn gj\u00eb. Nuk ka asnj\u00eb ndryshim n\u00eb performanc\u00eb. <\/p>\n<p><\/p>\n<p>Libra thon\u00eb se duhet t\u00eb kryejm\u00eb Batch statement, libra thon\u00eb se mund t\u00eb kryejm\u00eb komanda m\u00eb komplekse me disa kushte. Dhe n\u00eb Postgres ka nj\u00eb funksion t\u00eb shk\u00eblqyer - mund t\u00eb b\u00ebjm\u00eb COPY, dmth. ta b\u00ebjm\u00eb k\u00ebt\u00eb m\u00eb shpejt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/4d281c9515bdf8de7fbf1e9922d192d0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00ebse e matim, mund t\u00eb b\u00ebjm\u00eb disa zbulime interesante. Si duam q\u00eb kjo t\u00eb funksionoj\u00eb? Duam t\u00eb mos analizojm\u00eb dhe t\u00eb mos kryejm\u00eb komanda t\u00eb tep\u00ebrta. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/7b2e4343c51dab3ddb6919bf0f117c4d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00eb praktik\u00eb, TCP nuk na lejon t\u00eb b\u00ebjm\u00eb k\u00ebshtu. N\u00ebse klienti \u00ebsht\u00eb i z\u00ebn\u00eb duke d\u00ebrguar nj\u00eb k\u00ebrkes\u00eb, at\u00ebher\u00eb baza e t\u00eb dh\u00ebnave nuk lexon k\u00ebrkesat, duke u p\u00ebrpjekur t\u00eb na d\u00ebrgoj\u00eb p\u00ebrgjigje. N\u00eb fund, klienti pret baz\u00ebn e t\u00eb dh\u00ebnave derisa ajo t\u00eb lexoj\u00eb k\u00ebrkes\u00ebn, nd\u00ebrsa baza e t\u00eb dh\u00ebnave pret klientin derisa ai t\u00eb lexoj\u00eb p\u00ebrgjigjen. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/17a062c30ddd83cb890775ec1722044f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe k\u00ebshtu klienti \u00ebsht\u00eb i detyruar t\u00eb d\u00ebrgoj\u00eb periudhikisht nj\u00eb paket\u00eb sinkronizimi. Nd\u00ebrveprime t\u00eb panevojshme rrjet\u00ebrore, humbje e koh\u00ebs.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/ae7a4f32e2949c1d0550da051937de02.jpg\" style=\"display:block;margin: 0 auto;\" \/>Dhe sa m\u00eb shum\u00eb t'i shtojm\u00eb, aq m\u00eb keq b\u00ebhet. Driver-i \u00ebsht\u00eb shum\u00eb pesimist dhe i shton ato mjaft shpesh, rreth nj\u00eb her\u00eb n\u00eb 200 rreshta, n\u00eb var\u00ebsi t\u00eb madh\u00ebsis\u00eb s\u00eb rreshtave etj. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/82b1d597986633a8c4b7952517ca6477.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/380\">https:\/\/github.com\/pgjdbc\/pgjdbc\/pull\/380<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Ndonj\u00ebher\u00eb, kur korrigjon vet\u00ebm nj\u00eb rresht, \u00e7do gj\u00eb p\u00ebrshpejtohet dhjet\u00eb her\u00eb. Kjo ndodh. Pse? Si\u00e7 \u00ebsht\u00eb zakonisht, nj\u00eb konstante diku \u00ebsht\u00eb p\u00ebrdorur. Dhe vlera \"128\" n\u00ebnkupton - mos p\u00ebrdorni batching.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/7b6bcd95591b36441037b4c4631d2ad0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/openjdk.java.net\/projects\/code-tools\/jmh\/\">Java microbenchmark harness<\/a><\/noindex><\/p>\n<p><\/p>\n<p>\u00cbsht\u00eb mir\u00eb q\u00eb kjo nuk shkoi n\u00eb versionin zyrtar. E zbuluam para se t\u00eb fillonim versionin e l\u00ebshimit. T\u00eb gjitha vlerat q\u00eb po i p\u00ebrmend jan\u00eb t\u00eb bazuara n\u00eb versionet moderne. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/28c82d9e11f6bdaf3cf62b49fc074d68.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Le ta matim. Ne po matim InsertBatch t\u00eb thjesht\u00eb. Po matim InsertBatch t\u00eb shumt\u00eb, dmth. e nj\u00ebjta gj\u00eb, por shum\u00eb vlera. Nj\u00eb l\u00ebvizje e men\u00e7ur. Nuk t\u00eb gjith\u00eb e b\u00ebjn\u00eb k\u00ebshtu, por kjo \u00ebsht\u00eb nj\u00eb l\u00ebvizje e thjesht\u00eb, shum\u00eb m\u00eb e leht\u00eb se COPY.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/72f7cf6c3b9d9175d3e5a6d5410fe209.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mund t\u00eb b\u00ebjm\u00eb COPY.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/2b0d8bbcc50f1293c9a8a1eb8eb70d2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Dhe mund t\u00eb b\u00ebhet n\u00eb struktura. Deklaroni llojin default t\u00eb User, d\u00ebrgoni nj\u00eb array dhe b\u00ebni INSERT direkt n\u00eb tabel\u00eb. <\/p>\n<p><\/p>\n<p>N\u00ebse hapni lidhjen: pgjdbc\/ubenchmsrk\/InsertBatch.java, ky kod \u00ebsht\u00eb n\u00eb GitHub. Mund t\u00eb shihni konkretisht se cilat k\u00ebrkesa gjenerohen aty. Nuk ka r\u00ebnd\u00ebsi.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/28dede211fe401286685ca62081453de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E kemi nisur. Dhe gj\u00ebja e par\u00eb q\u00eb kuptuam \u00ebsht\u00eb se mos p\u00ebrdorimi i batch \u2013 thjesht nuk \u00ebsht\u00eb e mundur. T\u00eb gjitha variantet e batching jan\u00eb zero, dmth koha e ekzekutimit \u00ebsht\u00eb praktikisht zero krahasuar me ekzekutimin e nj\u00eb her\u00eb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/4ea68f712bbdeadd35f5baa4ddaeff33.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Po insertojm\u00eb t\u00eb dh\u00ebna. Ka nj\u00eb tabel\u00eb mjaft t\u00eb thjesht\u00eb. Tre kolona. Dhe \u00e7far\u00eb shohim k\u00ebtu? Shohim se t\u00eb gjitha k\u00ebto tre variante jan\u00eb p\u00ebraf\u00ebrsisht t\u00eb krahasueshme. Dhe COPY, sigurisht, \u00ebsht\u00eb m\u00eb e mira.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/2686f1d7eea347a839ac23aef2a27e53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ky \u00ebsht\u00eb kur ne insertojm\u00eb n\u00eb copa. Kur thonim se nj\u00eb vler\u00eb VALUES, dy vlera VALUES, tre vlera VALUES ose ne i kemi ato 10 me nj\u00eb presje. Kjo \u00ebsht\u00eb pik\u00ebrisht tani horizontalisht. 1, 2, 4, 128. \u00cbsht\u00eb e dukshme se Batch Insert, e cila \u00ebsht\u00eb vizatuar me blu, ndikon shum\u00eb leht\u00ebsisht. Dometh\u00ebn\u00eb, kur insertoni nj\u00ebri pas tjetrit ose madje edhe kur insertoni kat\u00ebr, b\u00ebhet dy her\u00eb m\u00eb mir\u00eb, thjesht sepse kemi futur pak m\u00eb shum\u00eb n\u00eb VALUES. M\u00eb pak operacione EXECUTE.<\/p>\n<p><\/p>\n<p>P\u00ebrdorimi i COPY p\u00ebr volume t\u00eb vogla \u2013 \u00ebsht\u00eb jasht\u00ebzakonisht t\u00eb paarsyesh\u00ebm. Deri n\u00eb dy t\u00eb parat madje nuk i kam vizatuar. Ata shkojn\u00eb n\u00eb qiell, dmth k\u00ebto numra t\u00eb gjelb\u00ebrta p\u00ebr COPY.<\/p>\n<p><\/p>\n<p>COPY duhet t\u00eb p\u00ebrdoret kur volumi i t\u00eb dh\u00ebnave \u00ebsht\u00eb t\u00eb pakt\u00ebn m\u00eb shum\u00eb se nj\u00ebqind rreshta. Shpenzimet p\u00ebr hapjen e k\u00ebsaj lidhjeje jan\u00eb t\u00eb m\u00ebdha. Dhe, sinqerisht, nuk kam k\u00ebrkuar shum\u00eb n\u00eb k\u00ebt\u00eb drejtim. E kam optimizuar batch, COPY \u2013 jo. <\/p>\n<p><\/p>\n<p>\u00c7far\u00eb b\u00ebjm\u00eb m\u00eb tej? E mat\u00ebm. Kuptojm\u00eb se duhet t\u00eb p\u00ebrdorim ose struktura, ose nj\u00eb batch t\u00eb men\u00e7ur q\u00eb bashkon disa vlera. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL dhe JDBC shtrydhim \u00e7do pik\u00eb. Vladimir Sitnikov\" src=\"\/wp-content\/uploads\/2020\/05\/e02fa2574e2d1b678382db15064610d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c7far\u00eb duhet t\u00eb nxirret nga referati i sot\u00ebm?<\/p>\n<p><\/p>\n<ul>\n<li>PreparedStatement \u2013 \u00ebsht\u00eb gjith\u00e7ka p\u00ebr ne. Kjo sjell shum\u00eb p\u00ebr performanc\u00ebn. Ajo sjell nj\u00eb grop\u00eb t\u00eb madhe katran. <\/li>\n<li>Dhe duhet t\u00eb b\u00ebni EXPLAIN ANALYZE 6 her\u00eb.<\/li>\n<li>Dhe duhet t\u00eb hollojm\u00eb OFFSET 0, dhe truket si +0 p\u00ebr t\u00eb rregulluar p\u00ebrqindjen e mbetur nga k\u00ebrkesat tona problematike.<\/li>\n<\/ul>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/499794\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432\u0430 &quot;PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438&quot; \u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e 10 \u043b\u0435\u0442 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 NetCracker. \u0418 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u0412\u0441\u0435, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 Java, \u0432\u0441\u0435, \u0447\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 SQL \u2013 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u044f \u043b\u044e\u0431\u043b\u044e. \u0418 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79894,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79893","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432\u0430 &quot;PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438&quot;\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438. \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432\u0430 &quot;PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438&quot;\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-01T11:43:12+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-01T11:43:12+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Po shtrydhim \u00e7do pik\u00eb nga PostgreSQL dhe JDBC. Vladimir Sitnikov | ProHoster","description":"Ju lutem shqyrtoni shpjegimin e raportit t\u00eb fillimit t\u00eb vitit 2016 nga Vladimir Sitnikov \"PostgreSQL dhe JDBC shfryt\u00ebzojm\u00eb t\u00eb gjitha burimet\"","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438. \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432 | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u0430 2016 \u0433\u043e\u0434\u0430 \u0412\u043b\u0430\u0434\u0438\u043c\u0438\u0440\u0430 \u0421\u0438\u0442\u043d\u0438\u043a\u043e\u0432\u0430 &quot;PostgreSQL \u0438 JDBC \u0432\u044b\u0436\u0438\u043c\u0430\u0435\u043c \u0432\u0441\u0435 \u0441\u043e\u043a\u0438&quot;","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-01T11:43:12+00:00","article:modified_time":"2020-05-01T11:43:12+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79893","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:29:39","updated":"2022-10-10 00:32:43","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/79893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=79893"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/79893\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/79894"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=79893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=79893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=79893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}