{"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\/hu\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","title":{"rendered":"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Javaslom, hogy ismerkedjen meg Vladimir Sitnikov 2016 eleji jelent\u00e9s\u00e9nek \"PostgreSQL \u00e9s JDBC - minden cseppj\u00e9t kihaszn\u00e1ljuk\" \u00e1t\u00edr\u00e1s\u00e1val.<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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 \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/030666abda53aa388b1cb1d0c46a7524.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>J\u00f3 napot! A nevem Vladimir Sitnikov. 10 \u00e9ve dolgozom a NetCracker c\u00e9gn\u00e9l, \u00e9s f\u0151k\u00e9nt a teljes\u00edtm\u00e9nyre specializ\u00e1l\u00f3dtam. Minden, ami a Java-hoz \u00e9s SQL-hez kapcsol\u00f3dik, az, amit szeretek. <\/p>\n<p><\/p>\n<p>Ma arr\u00f3l fogok besz\u00e9lni, hogy mikkel szembes\u00fclt\u00fcnk a c\u00e9gn\u00e9l, amikor elkezdt\u00fck a PostgreSQL-t adatb\u00e1ziszolg\u00e1ltat\u00f3k\u00e9nt haszn\u00e1lni. F\u0151k\u00e9nt Java-val dolgozunk, de amit ma elmondok, az nemcsak a Java-hoz kapcsol\u00f3dik. A gyakorlat azt mutatja, hogy ez m\u00e1s nyelvekben is el\u0151fordul. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/b01a214d782c7e32797a6c6466457979.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A k\u00f6vetkez\u0151kr\u0151l fogunk besz\u00e9lni:<\/p>\n<p><\/p>\n<ul>\n<li>az adatok lek\u00e9rdez\u00e9s\u00e9r\u0151l. <\/li>\n<li>az adatok t\u00e1rol\u00e1s\u00e1r\u00f3l. <\/li>\n<li>valamint a teljes\u00edtm\u00e9nyr\u0151l. <\/li>\n<li>\u00c9s a rejtett buktat\u00f3kr\u00f3l, amelyek ott megb\u00fajnak. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/57da0c6aa4bb62e1beb77160f5aee7e7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kezdj\u00fck egy egyszer\u0171 k\u00e9rd\u00e9ssel. Egy sor lek\u00e9rdez\u00e9s\u00e9t v\u00e9gezz\u00fck a t\u00e1bl\u00e1zat els\u0151dleges kulcsa alapj\u00e1n. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/d5fcb1172aef402a87064498bf8a5218.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az adatb\u00e1zis ugyanazon a hoszton tal\u00e1lhat\u00f3. \u00c9s mindez 20 milliszekundumot vesz ig\u00e9nybe.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/103b7f9736b82a3313491b2f0d2a5824.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez a 20 milliszekundum nagyon sok. Ha ilyen 100 lek\u00e9rdez\u00e9sed van, akkor m\u00e1sodperceket vesz\u00edtesz azzal, hogy ezeket a lek\u00e9rdez\u00e9seket futtatod, teh\u00e1t id\u0151t pazarolsz.<\/p>\n<p><\/p>\n<p>Ezt nem szeretj\u00fck, \u00e9s megn\u00e9zz\u00fck, mit k\u00edn\u00e1l az adatb\u00e1zis sz\u00e1munkra ehhez. Az adatb\u00e1zis k\u00e9t lek\u00e9rdez\u00e9si v\u00e9grehajt\u00e1si lehet\u0151s\u00e9get k\u00edn\u00e1l. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/b467e86a0f8c4c32cea182fe27a28e6e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Az els\u0151 lehet\u0151s\u00e9g egy egyszer\u0171 lek\u00e9rdez\u00e9s. Mi\u00e9rt j\u00f3 ez? Mert egyszer\u0171en csak elk\u00fcldj\u00fck, \u00e9s semmi m\u00e1s. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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>Az adatb\u00e1zisnak van egy kiterjesztett lek\u00e9rdez\u00e9se is, amely okosabb, de funkcion\u00e1lisabb. Lehet\u0151s\u00e9ged van k\u00fcl\u00f6n lek\u00e9rdez\u00e9seket k\u00fcldeni elemz\u00e9sre, v\u00e9grehajt\u00e1sra, v\u00e1ltoz\u00f3k \u00f6sszekapcsol\u00e1s\u00e1ra stb. <\/p>\n<p><\/p>\n<p>A super extended query az, amir\u0151l a jelenlegi el\u0151ad\u00e1sunkban nem fogunk besz\u00e9lni. Lehet, hogy valamit szeretn\u00e9nk az adatb\u00e1zist\u00f3l, \u00e9s van egy olyan k\u00edv\u00e1ns\u00e1glista, ami valamilyen form\u00e1ban l\u00e9trej\u00f6tt, teh\u00e1t ez az, amit szeretn\u00e9nk, de jelenleg \u00e9s a k\u00f6vetkez\u0151 \u00e9vben nem lehets\u00e9ges. Ez\u00e9rt egyszer\u0171en feljegyezt\u00fck \u00e9s j\u00e1runk, hogy megpr\u00f3b\u00e1ljuk megr\u00e1zni a kulcsszerepl\u0151ket.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/19094729074fd28c5b9f236833a9a266.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ami viszont megtehet\u0151, az a simple query \u00e9s az extended query.<\/p>\n<p><\/p>\n<p>Milyen jellemz\u0151i vannak minden egyes megk\u00f6zel\u00edt\u00e9snek? <\/p>\n<p><\/p>\n<p>Az egyszer\u0171 lek\u00e9rdez\u00e9st j\u00f3l lehet haszn\u00e1lni egyszeri v\u00e9grehajt\u00e1sra. Egyszer v\u00e9grehajtottuk \u00e9s elfelejtett\u00fck. A probl\u00e9ma az, hogy nem t\u00e1mogatja a bin\u00e1ris adatform\u00e1tumokat, teh\u00e1t bizonyos nagy teljes\u00edtm\u00e9ny\u0171 rendszerekhez nem alkalmas.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/062c0e45cefd91ece331a306a7651bde.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A kiterjesztett lek\u00e9rdez\u00e9s lehet\u0151v\u00e9 teszi az id\u0151megtakar\u00edt\u00e1st a parse-n\u00e1l. Ezt csin\u00e1ltuk \u00e9s kezdt\u00fck el haszn\u00e1lni. Nagyon-nagyon seg\u00edtett nek\u00fcnk. Nemcsak a parse-n\u00e1l van megtakar\u00edt\u00e1s. Az adat\u00e1tvitelben is van megtakar\u00edt\u00e1s. Az adatok bin\u00e1ris form\u00e1tumban t\u00f6rt\u00e9n\u0151 tov\u00e1bb\u00edt\u00e1sa l\u00e9nyegesen hat\u00e9konyabb. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/6df83a2f3736568668cf9d74de5d9758.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck a gyakorlatot. \u00cdgy n\u00e9z ki egy tipikus alkalmaz\u00e1s. Ez lehet Java stb. <\/p>\n<p><\/p>\n<p>L\u00e9trehoztunk egy statementet. V\u00e9grehajtottuk a parancsot. L\u00e9trehoztunk egy close-t. Hol van itt a hiba? Mi a probl\u00e9ma? Nincsenek probl\u00e9m\u00e1k. \u00cdgy van le\u00edrva az \u00f6sszes k\u00f6nyvben. \u00cdgy kell \u00edrni. Ha maxim\u00e1lis teljes\u00edtm\u00e9nyt szeretne, akkor \u00edgy \u00edrjon. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/6923293946dec45b3fd508235728ab95.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De a gyakorlat azt mutatta, hogy ez nem m\u0171k\u00f6dik. Mi\u00e9rt? Mert van egy \u2018close\u2019 met\u00f3dusunk. \u00c9s amikor \u00edgy csin\u00e1ljuk, az adatb\u00e1zis szempontj\u00e1b\u00f3l \u00fagy t\u0171nik, mint egy doh\u00e1nyos munk\u00e1ja az adatb\u00e1zissal. Azt mondtuk: \u2018PARSE EXECUTE DEALLOCATE\u2019.<\/p>\n<p><\/p>\n<p>Mi\u00e9rt vannak ezek a felesleges l\u00e9trehoz\u00e1sok \u00e9s statementek kivitele? Senkinek sincs sz\u00fcks\u00e9ge r\u00e1. De \u00e1ltal\u00e1ban a PreparedStatement eset\u00e9ben ez t\u00f6rt\u00e9nik, amikor bez\u00e1rjuk, az \u00f6sszeset bez\u00e1rja az adatb\u00e1zison. Ez nem az, amit szeretn\u00e9nk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/5a357a209e414024c437d042f600f251.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Azt szeretn\u00e9nk, hogy mint eg\u00e9szs\u00e9ges emberek, dolgozzunk az adatb\u00e1zissal. Egyszer elk\u00e9sz\u00edtett\u00fck a statementet, majd sokszor v\u00e9grehajtjuk. Val\u00f3j\u00e1ban sokszor \u2013 ez egyszer van az alkalmaz\u00e1s \u00e9lete alatt, \u00e9s k\u00fcl\u00f6nb\u00f6z\u0151 REST eset\u00e9n azonos statement id-t haszn\u00e1lunk. Ez a c\u00e9lunk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/ac4aed702a624ad9f9addc4362daf760.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hogyan \u00e9rhetj\u00fck el ezt? <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/0f101d890d1a2af8e99f8a3a8a06fd5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nagyon egyszer\u0171 \u2013 nem kell bez\u00e1rni a statementeket. \u00cdrjuk \u00edgy: \u2018prepare\u2019 \u2018execute\u2019. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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 \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/724646bfc55b5e2b611b1584ca8ba6aa.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha ezt fogjuk futtatni, vil\u00e1gos, hogy valahol valami t\u00falcsordul. Ha nem vil\u00e1gos, akkor lem\u00e9rhetj\u00fck. V\u00e1lasszunk egy benchmarkot, amelyben egy ilyen egyszer\u0171 met\u00f3dus van. L\u00e9trehozunk egy statementet. Futtatjuk valamelyik driver verzi\u00f3n, \u00e9s megkapjuk, hogy el\u00e9g gyorsan megborul az \u00f6sszes mem\u00f3ria, ami a megsz\u0171nt. <\/p>\n<p><\/p>\n<p>Nyilv\u00e1nval\u00f3, hogy az ilyen hib\u00e1k k\u00f6nnyen jav\u00edthat\u00f3k. Err\u0151l nem fogok besz\u00e9lni. De azt mondom, hogy az \u00faj verzi\u00f3 sokkal gyorsabban m\u0171k\u00f6dik. A met\u00f3dus \u00e9rtelmetlen, de m\u00e9gis. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/b232a6205e708c70f52be0024bbe9980.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Hogyan kell helyesen dolgozni? Mit kell tenn\u00fcnk ez\u00e9rt?<\/p>\n<p><\/p>\n<p>A gyakorlatban az alkalmaz\u00e1sok mindig bez\u00e1rj\u00e1k a statementeket. Minden k\u00f6nyvben azt \u00edrj\u00e1k, hogy be kell z\u00e1rni, k\u00fcl\u00f6nben sziv\u00e1rog a mem\u00f3ria. <\/p>\n<p><\/p>\n<p>A PostgreSQL pedig nem tudja cache-elni a lek\u00e9rdez\u00e9seket. Mindegyik session-nek mag\u00e1nak kell l\u00e9trehoznia ezt a cache-t. <\/p>\n<p><\/p>\n<p>Az id\u0151t sem akarjuk a parse-ra pazarolni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/85b9574938aa6e6bf59c956e3728bdc3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s ahogy \u00e1ltal\u00e1ban, k\u00e9t lehet\u0151s\u00e9g\u00fcnk van. <\/p>\n<p><\/p>\n<p>Az els\u0151 lehet\u0151s\u00e9g \u2013 azt mondjuk, hogy mindent csavarjunk be PgSQL-be. Ott van cache. Minden cache-el. Remek\u00fcl fog m\u0171k\u00f6dni. Megn\u00e9zt\u00fck ezt. 100500 lek\u00e9rdez\u00e9s\u00fcnk van. Nem m\u0171k\u00f6dik. Nem \u00e9rt\u00fcnk egyet \u2013 k\u00e9zzel elj\u00e1r\u00e1sokk\u00e1 alak\u00edtani a lek\u00e9rdez\u00e9seket. Nem-nem. <\/p>\n<p><\/p>\n<p>Van egy m\u00e1sodik lehet\u0151s\u00e9g \u2013 vegy\u00fck \u00e9s csin\u00e1ljuk meg magunk. Megnyitjuk a forr\u00e1sk\u00f3dot, \u00e9s elkezdj\u00fck csin\u00e1lni. Csin\u00e1ljuk-csin\u00e1ljuk. Kider\u00fclt, hogy nem is olyan neh\u00e9z ezt megtenni. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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>Ez 2015 augusztus\u00e1ban jelent meg. Most m\u00e1r egy modernebb verzi\u00f3 van. \u00c9s minden szuper. Olyan j\u00f3l m\u0171k\u00f6dik, hogy semmit sem v\u00e1ltoztatunk az alkalmaz\u00e1sban. M\u00e9g abbahagytuk a PgSQL ir\u00e1ny\u00e1ba val\u00f3 gondolkod\u00e1st is, vagyis ez el\u00e9g volt ahhoz, hogy a minden k\u00f6lts\u00e9get gyakorlatilag null\u00e1ra cs\u00f6kkents\u00fcnk. <\/p>\n<p><\/p>\n<p>Ez\u00e9rt a server-prepared statements az 5. v\u00e9grehajt\u00e1sn\u00e1l aktiv\u00e1l\u00f3dik, hogy ne pazaroljunk mem\u00f3ri\u00e1t az adatb\u00e1zisban minden egyes egyszeri lek\u00e9rdez\u00e9sre. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/8ee95e71f92187941989ad0c18ece0c0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>K\u00e9rdezheti \u2013 hol vannak a sz\u00e1mok? Mit kap? Itt viszont sz\u00e1mokat nem mondok, mert minden lek\u00e9rdez\u00e9snek saj\u00e1t sz\u00e1mai vannak.<\/p>\n<p><\/p>\n<p>Olyan lek\u00e9rdez\u00e9seink voltak, hogy az OLTP lek\u00e9rdez\u00e9sek parsingj\u00e1ra k\u00f6r\u00fclbel\u00fcl 20 milliszekundumot t\u00f6lt\u00f6tt\u00fcnk. Ott volt 0,5 milliszekundum a v\u00e9grehajt\u00e1sra, 20 milliszekundum a parsingra. A lek\u00e9rdez\u00e9s \u2013 10 KiB sz\u00f6veg, 170 soros terv. Ez egy OLTP lek\u00e9rdez\u00e9s. K\u00e9rdez 1, 5, 10 sort, n\u00e9ha t\u00f6bbet. <\/p>\n<p><\/p>\n<p>De egy\u00e1ltal\u00e1n nem akartuk 20 milliszekundumot pazarolni. Nulla m\u00e1sodpercre cs\u00f6kkentett\u00fck. Minden szuper. <\/p>\n<p><\/p>\n<p>Mit vihet innen? Ha Java-ja van, akkor vegye a modern verzi\u00f3j\u00fa drivert, \u00e9s \u00f6r\u00fclj\u00f6n neki. <\/p>\n<p><\/p>\n<p>Ha m\u00e1s nyelvvel dolgozik, akkor gondolkodjon el \u2013 lehet, hogy ezt is meg kellene tennie? Mert a v\u00e9gs\u0151 nyelv szempontj\u00e1b\u00f3l, p\u00e9ld\u00e1ul, ha PL 8 vagy LibPQ van, nem nyilv\u00e1nval\u00f3, hogy az id\u0151t nem a v\u00e9grehajt\u00e1sra, hanem a parsingra pazarolja, \u00e9s ezt \u00e9rdemes \u00e1tn\u00e9zni. Hogyan? Minden ingyenes. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/fda6b1c1b126cb85c970e42335e1dc24.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Kiv\u00e9ve, ha vannak hib\u00e1k, valamilyen saj\u00e1toss\u00e1gok. Ezekr\u0151l most fogunk besz\u00e9lni. A nagy r\u00e9sze az ipari r\u00e9g\u00e9szethez kapcsol\u00f3dik, arr\u00f3l, amit felfedezt\u00fcnk, amibe bele\u00fctk\u00f6zt\u00fcnk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/9a3b383f83c5e227cd02952c5825b64f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha a lek\u00e9rdez\u00e9s dinamikusan gener\u00e1l\u00f3dik. Ilyen is el\u0151fordul. Valaki concaten\u00e1lja a sorokat, \u00e9s SQL-lek\u00e9rdez\u00e9s lesz bel\u0151le.<\/p>\n<p><\/p>\n<p>Mi\u00e9rt rossz ez? Az\u00e9rt rossz, mert minden alkalommal v\u00e9g\u00fcl k\u00fcl\u00f6nb\u00f6z\u0151 sorokat kapunk.<\/p>\n<p><\/p>\n<p>\u00c9s ennek a k\u00fcl\u00f6nb\u00f6z\u0151 sorozatnak \u00fajra kell sz\u00e1molnia a hashCode-ot. Ez val\u00f3ban CPU feladat \u2013 tal\u00e1lni egy hossz\u00fa lek\u00e9rdez\u00e9st m\u00e9g a megl\u00e9v\u0151 hash-ben sem olyan egyszer\u0171. Teh\u00e1t a k\u00f6vetkeztet\u00e9s egy\u00e9rtelm\u0171 \u2013 ne gener\u00e1lj lek\u00e9rdez\u00e9seket. T\u00e1rold \u0151ket egy v\u00e1ltoz\u00f3ban. \u00c9s \u00f6r\u00fclj neki.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/bcd4f729204cecdb572a98f357bcc33f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A k\u00f6vetkez\u0151 probl\u00e9ma. Az adat t\u00edpusa fontos. Vannak ORM-ek, amelyek azt mondj\u00e1k, hogy nem mindegy, milyen NULL, legyen csak valamilyen. Ha Int, akkor azt mondjuk, setInt. Ha pedig NULL, akkor legyen mindig VARCHAR. \u00c9s v\u00e9g\u00fcl mi\u00e9rt is sz\u00e1m\u00edt, hogy milyen NULL van ott? Az adatb\u00e1zis mag\u00e1t\u00f3l mindent meg\u00e9rt. <\/p>\n<p><\/p>\n<p>A gyakorlatban az adatb\u00e1zisnak egy\u00e1ltal\u00e1n nem mindegy. <strong>Ha els\u0151 alkalommal azt mondtad, hogy ez egy sz\u00e1m, majd a m\u00e1sodik alkalommal azt mondtad, hogy ez VARCHAR, akkor lehetetlen \u00fajra felhaszn\u00e1lni a Server-prepared statements-t. Ilyen esetben \u00fajra kell l\u00e9trehozni a statement\u00fcnket.<\/strong><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/552d9c2e25cf9abbdfef12c98d027740.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha ugyanazt a lek\u00e9rdez\u00e9st hajtod v\u00e9gre, figyelj arra, hogy az oszlop adat t\u00edpusa ne keveredjen. Figyelned kell a NULL-ra. Ez gyakori hiba volt n\u00e1lunk, miut\u00e1n elkezdt\u00fck haszn\u00e1lni a PreparedStatements-t.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/5d73c8f5dfa281c3bda962fc3e5edd84.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Rendben, bekapcsoltuk. Tal\u00e1n vett\u00fcnk egy drivert. \u00c9s a teljes\u00edtm\u00e9ny cs\u00f6kkent. Minden rossz lett. <\/p>\n<p><\/p>\n<p>Hogy lehet ez? Hiba vagy funkci\u00f3? Sajnos nem tudtuk meg\u00e9rteni \u2013 hiba vagy funkci\u00f3. De van egy meglehet\u0151sen egyszer\u0171 reproduk\u00e1l\u00e1si forgat\u00f3k\u00f6nyv ennek a probl\u00e9m\u00e1nak. Teljesen v\u00e1ratlanul elkapott minket. \u00c9s ez egy t\u00e1bl\u00e1b\u00f3l val\u00f3 lek\u00e9rdez\u00e9sr\u0151l sz\u00f3l. Persze, t\u00f6bb ilyen lek\u00e9rdez\u00e9s\u00fcnk volt. Ezek \u00e1ltal\u00e1ban k\u00e9t-h\u00e1rom t\u00e1bl\u00e1t tartalmaztak, de van egy ilyen reproduk\u00e1l\u00e1si forgat\u00f3k\u00f6nyv. Vedd le b\u00e1rmelyik verzi\u00f3j\u00fa adatb\u00e1zison \u00e9s reproduk\u00e1ld azt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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>A l\u00e9nyege az, hogy van k\u00e9t oszlopunk, mindkett\u0151 indexelve van. Az egyik oszlopban a NULL \u00e9rt\u00e9k alatt egymilli\u00f3 sor van. A m\u00e1sik oszlopban csak 20 sor van. Amikor \u00f6sszef\u00fcgg\u0151 v\u00e1ltoz\u00f3k n\u00e9lk\u00fcl hajtjuk v\u00e9gre, minden j\u00f3l m\u0171k\u00f6dik. <\/p>\n<p><\/p>\n<p>Ha \u00f6sszef\u00fcgg\u0151 v\u00e1ltoz\u00f3kkal kezdj\u00fck el v\u00e9grehajtani, azaz a lek\u00e9rdez\u00e9s\u00fcnk sz\u00e1m\u00e1ra \u201e?\u201d vagy \u201e$1\u201d jelet haszn\u00e1lunk, akkor mit kapunk v\u00e9g\u00fcl?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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>Els\u0151 v\u00e9grehajt\u00e1s \u2013 ahogyan kell. M\u00e1sodik \u2013 kicsit gyorsabb. Valami cache-elt. Harmadik-n\u00e9gyedik-\u00f6t\u00f6dik. Azt\u00e1n puff \u2013 \u00e9s \u00edgy. A legrosszabb pedig az, hogy ez a hatodik v\u00e9grehajt\u00e1sn\u00e1l t\u00f6rt\u00e9nik. Ki tudta, hogy hat v\u00e9grehajt\u00e1sra van sz\u00fcks\u00e9g ahhoz, hogy meg\u00e9rts\u00fck, val\u00f3j\u00e1ban mi a v\u00e9grehajt\u00e1si terv?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/893c955bc1e2e15a6986690e516f72a9.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ki a hib\u00e1s? Mi t\u00f6rt\u00e9nt? Az adatb\u00e1zis tartalmaz optimaliz\u00e1l\u00e1st. \u00c9s \u00fagy van optimaliz\u00e1lva, hogy \u00e1ltal\u00e1nos esetben j\u00f3l m\u0171k\u00f6dj\u00f6n. Ennek megfelel\u0151en, egy bizonyos alkalomt\u00f3l kezdve \u00e1tmegy az \u00e1ltal\u00e1nos tervre, ami sajnos lehet m\u00e1s. Lehet ugyanolyan, vagy lehet m\u00e1s. Van egy k\u00fcsz\u00f6b\u00e9rt\u00e9k, ami ezt a viselked\u00e9st okozza. <\/p>\n<p><\/p>\n<p>Mit lehet ezzel tenni? Itt persze neh\u00e9z valamit felt\u00e9telezni. Van egy egyszer\u0171 megold\u00e1s, amit haszn\u00e1lunk. Ez a +0, OFFSET 0. Biztosan ismered ezeket a megold\u00e1sokat. Csak hozz\u00e1adjuk a lek\u00e9rdez\u00e9shez a \u201e+0\u201d-t, \u00e9s minden rendben van. K\u00e9s\u0151bb megmutatom. <\/p>\n<p><\/p>\n<p>\u00c9s van egy m\u00e1sik lehet\u0151s\u00e9g is \u2013 figyelmesebben kell n\u00e9zni a terveket. A fejleszt\u0151nek nemcsak a lek\u00e9rdez\u00e9st kell meg\u00edrni, hanem hatszor el kell mondania: \u201eexplain analyze\u201d. Ha \u00f6tsz\u00f6r, az nem megfelel\u0151. <\/p>\n<p><\/p>\n<p>\u00c9s van egy harmadik lehet\u0151s\u00e9g \u2013 levelet \u00edrni a pgsql-hackersnek. \u00cdrtam, de m\u00e9g nem vil\u00e1gos, hogy ez hiba vagy funkci\u00f3.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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>M\u00edg azon gondolkodunk, hogy hiba vagy funkci\u00f3, jav\u00edtsuk meg. Vegy\u00fck a lek\u00e9rdez\u00e9s\u00fcnket, \u00e9s adjunk hozz\u00e1 egy \u201e+0\u201d-t. Minden rendben van. K\u00e9t karakter, \u00e9s m\u00e9g csak azon sem kell gondolkodni, hogy mi van ott. Nagyon egyszer\u0171. Csak letiltottuk az adatb\u00e1zis sz\u00e1m\u00e1ra, hogy haszn\u00e1lja az indexet ezen az oszlopon. Nincs index\u00fcnk a \u201e+0\u201d oszlopra, \u00e9s az adatb\u00e1zis nem haszn\u00e1l indexet, minden rendben van. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/5261d80d084786a15b9764f6367014cd.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez a 6 explain szab\u00e1ly. Jelenlegi verzi\u00f3kban hatszor kell v\u00e9grehajtani, ha kapcsol\u00f3d\u00f3 v\u00e1ltoz\u00f3k vannak. Ha nincsenek kapcsol\u00f3d\u00f3 v\u00e1ltoz\u00f3k, akkor \u00edgy csin\u00e1ljuk. A v\u00e9g\u00e9n pontosan ez a lek\u00e9rdez\u00e9s fog megbukni. Nem nagy \u00fcgy.<\/p>\n<p><\/p>\n<p>Kinek t\u0171nik ez lehetetlennek? Itt van hiba, ott hiba. Val\u00f3j\u00e1ban mindenhol hiba van. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/674dc7e7b4624baa5c79eee9e1e89db0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fcnk m\u00e9g egy p\u00e9ld\u00e1t. P\u00e9ld\u00e1ul van k\u00e9t s\u00e9m\u00e1nk. Az \u201eA\u201d s\u00e9ma egy X t\u00e1bl\u00e1val, a \u201eB\u201d s\u00e9ma szint\u00e9n egy X t\u00e1bl\u00e1val. A lek\u00e9rdez\u00e9s \u2013 adatok kiv\u00e1laszt\u00e1sa a t\u00e1bl\u00e1b\u00f3l. Mi fog t\u00f6rt\u00e9nni? Hib\u00e1nk lesz. Minden felsorolt hiba jelentkezni fog. A szab\u00e1ly az, hogy mindenhol hiba van, minden felsorolt hiba meg fog jelenni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/dd6f544bb9e930c39e36523c9afe6003.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Most a k\u00e9rd\u00e9s: \u201eMi\u00e9rt?\u201d. \u00dagy t\u0171nik, van dokument\u00e1ci\u00f3, hogy ha van s\u00e9m\u00e1nk, van egy \u201esearch_path\u201d nev\u0171 v\u00e1ltoz\u00f3, amely megmondja, hol kell keresni a t\u00e1bl\u00e1t. \u00dagy t\u0171nik, a v\u00e1ltoz\u00f3 l\u00e9tezik.<\/p>\n<p><\/p>\n<p>Mi a probl\u00e9ma? A probl\u00e9ma az, hogy a server-prepared statements nem gyan\u00edtj\u00e1k, hogy a search_path-t b\u00e1rki megv\u00e1ltoztathatja. Ez az \u00e9rt\u00e9k konstanst jelent az adatb\u00e1zis sz\u00e1m\u00e1ra. \u00c9s bizonyos r\u00e9szek nem tudj\u00e1k \u00e1tkapcsolni az \u00faj \u00e9rt\u00e9keket. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/f738301606d84d72bfa7cc5b568c0df8.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Term\u00e9szetesen ez att\u00f3l f\u00fcgg, hogy melyik verzi\u00f3n tesztelsz. Att\u00f3l f\u00fcgg, mennyire komolyan k\u00fcl\u00f6nb\u00f6znek az adataid. A 9.1-es verzi\u00f3 egyszer\u0171en v\u00e9grehajtja a r\u00e9g\u00f3ta haszn\u00e1lt lek\u00e9rdez\u00e9seket. Az \u00fajabb verzi\u00f3k felfedezhetik a csapd\u00e1t \u00e9s jelezhetik, hogy hiba t\u00f6rt\u00e9nt.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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 + server-prepared statements =<br \/>\nA gyors\u00edt\u00f3t\u00e1razott terv nem v\u00e1ltoztathatja meg az eredm\u00e9ny t\u00edpus\u00e1t<\/a><\/noindex><\/p>\n<p><\/p>\n<p>Hogyan lehet ezt orvosolni? Van egy egyszer\u0171 recept \u2013 ne tedd ezt. Ne v\u00e1ltoztasd meg a search_path-ot az alkalmaz\u00e1s fut\u00e1sa k\u00f6zben. Ha v\u00e1ltoztatod, akkor ink\u00e1bb hozz l\u00e9tre \u00faj kapcsolatot.<\/p>\n<p><\/p>\n<p>Besz\u00e9lhet\u00fcnk r\u00f3la, azaz megnyithatjuk, megbesz\u00e9lhetj\u00fck, kieg\u00e9sz\u00edthetj\u00fck. Tal\u00e1n meggy\u0151zz\u00fck az adatb\u00e1zis-fejleszt\u0151ket, hogy amikor valaki megv\u00e1ltoztat egy \u00e9rt\u00e9ket, az adatb\u00e1zisnak erre figyelmeztetnie kellene a klienst: \u201eN\u00e9zd, megv\u00e1ltozott az \u00e9rt\u00e9ked. Tal\u00e1n \u00fajra kellene kezdened a statements-t?\u201d Jelenleg az adatb\u00e1zis titokban viselkedik \u00e9s nem k\u00f6z\u00f6l semmit arr\u00f3l, hogy a statements-ek valahol bel\u00fcl megv\u00e1ltoztak. <\/p>\n<p><\/p>\n<p>Ism\u00e9t hangs\u00falyozni szeretn\u00e9m \u2013 ez nem tipikus Java-ra. Ugyanezt l\u00e1tni fogjuk PL\/pgSQL eset\u00e9n is, egy az egyben. De ott reproduk\u00e1l\u00f3dni fog.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/a4e7b201d0c0aa4a0092d2b6ff152df7.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Pr\u00f3b\u00e1ljuk meg \u00fajra kiv\u00e1lasztani az adatokat. V\u00e1logatunk\u2013v\u00e1logatunk. Van egy t\u00e1bl\u00e1nk milli\u00f3 sorral. Minden sor egy kilobyte. K\u00f6r\u00fclbel\u00fcl egy gigabyte adatunk van. \u00c9s van 128 megabyte munkamem\u00f3ri\u00e1nk a Java g\u00e9pen. <\/p>\n<p><\/p>\n<p>A javaslatok szerint, amit az \u00f6sszes k\u00f6nyv mond, folyamatos feldolgoz\u00e1st haszn\u00e1lunk. Azaz megnyitjuk a resultSet-et \u00e9s fokozatosan olvassuk ki az adatokat. M\u0171k\u00f6dni fog ez? Nem fog hiba\u00fczenetet dobni a mem\u00f3ria miatt? Fokozatosan olvasni fog? Higgy\u00fcnk az adatb\u00e1zisban, higgy\u00fcnk a Postgres-ben. De nem hisz\u00fcnk. Ki esett m\u00e1r OutOfMemory hib\u00e1ba? Ki tudta azt jav\u00edtani? <\/p>\n<p><\/p>\n<p>Ha van egy milli\u00f3 sorod, akkor nem szabad csak \u00fagy kiv\u00e1lasztani. Mindig sz\u00fcks\u00e9ges a OFFSET\/LIMIT. Ki t\u00e1mogatja ezt a megold\u00e1st? Ki j\u00e1tszana az autoCommit-tal? <\/p>\n<p><\/p>\n<p>Itt, mint mindig, a legmeglep\u0151bb v\u00e1ltozat bizonyul helyesnek. Ha esetleg kikapcsolod az autoCommit-ot, az seg\u00edteni fog. Mi\u00e9rt van ez? A tudom\u00e1ny err\u0151l nem tud. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/2e5d9d2a8450a9069155de86a8ec387a.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>De alap\u00e9rtelmez\u00e9s szerint minden kliens, amely csatlakozik a Postgres adatb\u00e1zishoz, teljes adatokat v\u00e1laszt ki. A PgJDBC ezen a t\u00e9ren nem kiv\u00e9tel, minden sort v\u00e1laszt.<\/p>\n<p><\/p>\n<p>Van egy vari\u00e1ci\u00f3 a FetchSize t\u00e9m\u00e1j\u00e1ra, azaz egy adott statement szintj\u00e9n jelezhetj\u00fck, hogy itt, k\u00e9rlek, v\u00e1lassza ki az adatokat 10, 50-es csoportokban. De ez nem m\u0171k\u00f6dik, am\u00edg nem kapcsolod ki az autoCommit-ot. Amint kikapcsoltad az autoCommit-ot \u2013 elkezd m\u0171k\u00f6dni. <\/p>\n<p><\/p>\n<p>De a k\u00f3dot v\u00e9gigj\u00e1rni \u00e9s mindenhol setFetchSize-t be\u00e1ll\u00edtani \u2013 ez k\u00e9nyelmetlen. Ez\u00e9rt k\u00e9sz\u00edtett\u00fcnk egy olyan be\u00e1ll\u00edt\u00e1st, ami az eg\u00e9sz kapcsolatra vonatkoz\u00f3 alap\u00e9rtelmezett \u00e9rt\u00e9ket fogja megadni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/c9ac8e483dc6bfdbbc300972ee1ab1e0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Nos, ezt mondtuk. Be\u00e1ll\u00edtottuk a param\u00e9tert. \u00c9s mi lett az eredm\u00e9ny? Ha kicsire v\u00e1lasztunk, p\u00e9ld\u00e1ul 10 sorra, akkor el\u00e9g magasak a r\u00e1ford\u00edt\u00e1sok. Ez\u00e9rt ezt az \u00e9rt\u00e9ket k\u00f6r\u00fclbel\u00fcl sz\u00e1zra kellene \u00e1ll\u00edtani. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/073e7a4af63688396eefe332ba8261d6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ide\u00e1lisan, persze, byte-ban is korl\u00e1tozni kellene, de a recept a k\u00f6vetkez\u0151: \u00e1ll\u00edtsuk be a defaultRowFetchSize-t sz\u00e1zh\u00faszra \u00e9s \u00f6r\u00fclj\u00fcnk. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/e3078faf2078fcaec10d6d99872a9990.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Most t\u00e9rj\u00fcnk \u00e1t az adatok besz\u00far\u00e1s\u00e1ra. A besz\u00far\u00e1s egyszer\u0171bb, vannak k\u00fcl\u00f6nb\u00f6z\u0151 lehet\u0151s\u00e9gek. P\u00e9ld\u00e1ul, INSERT, VALUES. Ez egy j\u00f3 lehet\u0151s\u00e9g. Mondhatjuk, hogy 'INSERT SELECT'. A gyakorlatban ez egy \u00e9s ugyanaz. Nincs k\u00fcl\u00f6nbs\u00e9g a teljes\u00edtm\u00e9nyben. <\/p>\n<p><\/p>\n<p>A k\u00f6nyvek azt mondj\u00e1k, hogy Batch utas\u00edt\u00e1st kell v\u00e9grehajtani, a k\u00f6nyvek azt mondj\u00e1k, hogy bonyolultabb parancsokat is v\u00e9grehajthatunk t\u00f6bb z\u00e1r\u00f3jel k\u00f6z\u00f6tt. \u00c9s a Postgres-ban van egy csod\u00e1latos funkci\u00f3 \u2013 a COPY, azaz ezt gyorsabban tudjuk v\u00e9grehajtani. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/4d281c9515bdf8de7fbf1e9922d192d0.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ha megm\u00e9rj\u00fck, akkor \u00fajabb \u00e9rdekes felfedez\u00e9seket tehet\u00fcnk. Hogyan szeretn\u00e9nk, hogy ez m\u0171k\u00f6dj\u00f6n? Szeretn\u00e9nk, ha nem kellene parszolni \u00e9s felesleges parancsokat v\u00e9grehajtani. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/7b2e4343c51dab3ddb6919bf0f117c4d.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A gyakorlatban a TCP ezt nem teszi lehet\u0151v\u00e9. Ha az \u00fcgyf\u00e9l \u00e9ppen a k\u00e9r\u00e9s elk\u00fcld\u00e9s\u00e9vel foglalkozik, akkor az adatb\u00e1zis a v\u00e1laszok visszak\u00fcld\u00e9s\u00e9re tett k\u00eds\u00e9rletekben nem olvassa el a k\u00e9rd\u00e9seket. V\u00e9gs\u0151 soron az \u00fcgyf\u00e9l v\u00e1r az adatb\u00e1zisra, am\u00edg az elolvassa a k\u00e9rd\u00e9st, m\u00edg az adatb\u00e1zis v\u00e1r az \u00fcgyf\u00e9lre, am\u00edg elolvassa a v\u00e1laszt. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/17a062c30ddd83cb890775ec1722044f.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez\u00e9rt az \u00fcgyf\u00e9lnek id\u0151nk\u00e9nt szinkroniz\u00e1l\u00f3 csomagokat kell k\u00fcldenie. Felesleges h\u00e1l\u00f3zati interakci\u00f3k, felesleges id\u0151vesztes\u00e9g.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/ae7a4f32e2949c1d0550da051937de02.jpg\" style=\"display:block;margin: 0 auto;\" \/>Min\u00e9l t\u00f6bbet adunk hozz\u00e1, ann\u00e1l rosszabb lesz. A meghajt\u00f3 meglehet\u0151sen pesszimista, \u00e9s el\u00e9g gyakran, k\u00f6r\u00fclbel\u00fcl 200 soronk\u00e9nt, m\u00e9ret\u00e9t\u0151l \u00e9s hasonl\u00f3kt\u00f3l f\u00fcgg\u0151en, hozz\u00e1adja ezeket. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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>El\u0151fordul, hogy csak egy sort m\u00f3dos\u00edtunk, \u00e9s t\u00edzszer gyorsabb\u00e1 v\u00e1lik minden. Ez n\u00e9ha megt\u00f6rt\u00e9nik. Mi\u00e9rt? \u00c1ltal\u00e1ban az\u00e9rt, mert egy konstans m\u00e1r megl\u00e9v\u0151 volt valahol. \u00c9s a '128' \u00e9rt\u00e9k azt jelentette \u2013 ne haszn\u00e1lj batching-et.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" 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 mikrobenchmark keretrendszer<\/a><\/noindex><\/p>\n<p><\/p>\n<p>J\u00f3, hogy ez nem ker\u00fclt be az hivatalos verzi\u00f3ba. Felfedezt\u00fck, miel\u0151tt elkezdt\u00fck volna a kiad\u00e1st. Az \u00f6sszes \u00e9rt\u00e9k, amit eml\u00edtek, a modern verzi\u00f3kon alapul. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/28c82d9e11f6bdaf3cf62b49fc074d68.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00e9zz\u00fck meg. Az egyszer\u0171 InsertBatch-t m\u00e9rj\u00fck. A t\u00f6bbsz\u00f6r\u00f6s InsertBatch-t m\u00e9rj\u00fck, azaz ugyanaz, de sok values-szal. Tr\u00fckk\u00f6s l\u00e9p\u00e9s. Nem mindenki tudja ezt, de ez egy egyszer\u0171 l\u00e9p\u00e9s, sokkal k\u00f6nnyebb, mint a COPY.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/72f7cf6c3b9d9175d3e5a6d5410fe209.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Lehet COPY-t haszn\u00e1lni.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/2b0d8bbcc50f1293c9a8a1eb8eb70d2e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u00c9s ezt a strukt\u00far\u00e1kon is meg lehet csin\u00e1lni. Be kell jelenteni a User alap\u00e9rtelmezett t\u00edpust, \u00e1tadni egy t\u00f6mb\u00f6t, \u00e9s k\u00f6zvetlen\u00fcl INSERT-\u00e1lni a t\u00e1bl\u00e1ba. <\/p>\n<p><\/p>\n<p>Ha megnyitja a k\u00f6vetkez\u0151 linket: pgjdbc\/ubenchmsrk\/InsertBatch.java, akkor ez a k\u00f3d megtal\u00e1lhat\u00f3 a GitHub-on. Meg lehet n\u00e9zni, hogy pontosan milyen lek\u00e9rdez\u00e9sek gener\u00e1l\u00f3dnak ott. Nem ez a l\u00e9nyeg.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/28dede211fe401286685ca62081453de.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Elind\u00edtottuk. \u00c9s az els\u0151 dolog, amit \u00e9szrevett\u00fcnk, hogy a batch haszn\u00e1lata elengedhetetlen. Minden batch-el\u00e9si v\u00e1ltozat null\u00e1nak sz\u00e1m\u00edt, azaz a v\u00e9grehajt\u00e1si id\u0151 szinte nulla egy nagyobb v\u00e9grehajt\u00e1shoz k\u00e9pest. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/4ea68f712bbdeadd35f5baa4ddaeff33.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Adatokat illeszt\u00fcnk be. \u00c9ppen egy egyszer\u0171 t\u00e1bl\u00e1zatr\u00f3l van sz\u00f3. H\u00e1rom oszlop. \u00c9s mit l\u00e1tunk itt? L\u00e1tjuk, hogy mindh\u00e1rom v\u00e1ltozat k\u00f6r\u00fclbel\u00fcl hasonl\u00f3. \u00c9s a COPY term\u00e9szetesen a legjobb.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/2686f1d7eea347a839ac23aef2a27e53.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ez amikor darabokban illeszt\u00fcnk be. Amikor azt mondtuk, hogy egy \u00e9rt\u00e9k VALUES, k\u00e9t \u00e9rt\u00e9k VALUES, h\u00e1rom \u00e9rt\u00e9k VALUES, vagy ha ott 10-et vessz\u00fck vessz\u0151vel elv\u00e1lasztva. Most \u00e9ppen v\u00edzszintesen. 1, 2, 4, 128. Egy\u00e9rtelm\u0171, hogy a Batch Insert, ami k\u00e9k sz\u00ednnel van \u00e1br\u00e1zolva, sokkal k\u00f6nnyebb lesz t\u0151le. Azaz, amikor egyes\u00e9vel illeszt be, vagy ak\u00e1r n\u00e9gyet is, akkor ez k\u00e9tszer olyan jobb, csak att\u00f3l, hogy a VALUES-ba egy kicsit t\u00f6bbet betett\u00fcnk. Kevesebb EXECUTE m\u0171velet.<\/p>\n<p><\/p>\n<p>A COPY haszn\u00e1lata kis mennyis\u00e9gekben rendk\u00edv\u00fcl nem c\u00e9lszer\u0171. Az els\u0151 kett\u0151t m\u00e9g fel sem rajzoltam. Azok az \u00e9g fel\u00e9 mutatnak, vagyis ezek a z\u00f6ld sz\u00e1mok a COPY sz\u00e1m\u00e1ra.<\/p>\n<p><\/p>\n<p>A COPY-t akkor kell haszn\u00e1lni, ha az adatmennyis\u00e9g legal\u00e1bb t\u00f6bb mint sz\u00e1z sor. A kapcsolat megnyit\u00e1s\u00e1ra ford\u00edtott k\u00f6lts\u00e9gek magasak. \u0150szint\u00e9n sz\u00f3lva, ebbe az ir\u00e1nyba nem m\u00e9lyedtem el. A batch-t optimaliz\u00e1ltam, a COPY-t nem. <\/p>\n<p><\/p>\n<p>Mit tesz\u00fcnk ezut\u00e1n? Megm\u00e9rt\u00fck. \u00c9rtj\u00fck, hogy vagy strukt\u00far\u00e1kat, vagy egy \u00fcgyes batch-et kell haszn\u00e1lnunk, amely egyes\u00edti a k\u00fcl\u00f6nb\u00f6z\u0151 \u00e9rt\u00e9keket. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"PostgreSQL \u00e9s JDBC - kihozzuk bel\u0151le a maximumot. Vlagyimir Szitynikov\" src=\"\/wp-content\/uploads\/2020\/05\/e02fa2574e2d1b678382db15064610d3.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mi az, amit ki kell emelni a mai el\u0151ad\u00e1sb\u00f3l?<\/p>\n<p><\/p>\n<ul>\n<li>A PreparedStatement a mi minden\u00fcnk. Nagyon sokat hozz\u00e1j\u00e1rul a teljes\u00edtm\u00e9nyhez. Nagy tart\u00e1ly m\u00e9ret\u0171 pluszokat ad. <\/li>\n<li>\u00c9s 6 alkalommal kell EXPLAIN ANALYZE-t v\u00e9gezni.<\/li>\n<li>\u00c9s az OFFSET 0-\u00e1t kell h\u00edg\u00edtani, \u00e9s olyan tr\u00fckk\u00f6kkel, mint a +0, hogy kezelj\u00fck a probl\u00e9m\u00e1s lek\u00e9rdez\u00e9sek megmarad\u00f3 sz\u00e1zal\u00e9k\u00e1t.<\/li>\n<\/ul>\n<p>Forr\u00e1s: <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.3 - 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\/hu\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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\udd47PostgreSQL \u00e9s JDBC - b\u00e1rmilyen lehet\u0151s\u00e9get kiakn\u00e1zunk. Vladimir Sitnikov | ProHoster","description":"Javaslatom van, hogy ismerkedjen meg Vladimir Sitnikov 2016 eleji \"PostgreSQL \u00e9s JDBC: minden cseppj\u00e9t kihaszn\u00e1lva\" el\u0151ad\u00e1s\u00e1nak \u00e1t\u00edr\u00e1s\u00e1val.","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/postgresql-i-jdbc-vyzhimaem-vse-soki-vladimir-sitnikov","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/79893","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=79893"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/79893\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/79894"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=79893"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=79893"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=79893"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}