PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Waxaan kuu soo jeedinayaa inaad akhrido qoraalka Vladimir Sitnikov's horraantii 2016 warbixinta "PostgreSQL iyo JDBC waxay tuujinayaan dhammaan casiirka"

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Galab wanaagsan Magacaygu waa Vladimir Sitnikov. Waxaan u shaqaynayay NetCracker 10 sano. Oo waxaan inta badan galay wax soo saarka. Wax kasta oo la xidhiidha Java, wax kasta oo la xidhiidha SQL waa waxa aan jeclahay.

Maantana waxaan ka hadli doonaa wixii aan kala kulanay shirkadda markii aan bilownay adeegsiga PostgreSQL sida server-ka xogta. Waxaana inta badan la shaqeeya Java. Laakiin waxa aan maanta kuu sheegi doono maaha Java oo keliya. Sida dhaqanku muujiyay, tani waxay sidoo kale ku dhacdaa luqadaha kale.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Waxaan ka hadli doonaa:

  • ku saabsan tusaaleynta xogta.
  • Ku saabsan kaydinta xogta
  • Iyo sidoo kale waxqabadka.
  • Iyo wax ku saabsan jeexyada biyaha hoostooda ku duugan.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Aan ku bilowno su'aal fudud. Waxaan miiska ka dooranaa hal saf oo ku saleysan furaha aasaasiga ah.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Xog-ururinta waxay ku taal isla martigeliyaha. Wax-beerashadan oo dhamina waxay qaadataa 20 millise seconds.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

20ka millise seconds waa badan yihiin. Haddii aad haysato 100 codsi oo noocaas ah, markaa waxaad ku bixinaysaa wakhti ilbiriqsi kasta adigoo isticmaalaya codsiyadan, i.. waxaan ku dhumineynaa waqti.

Ma jecli in aan tan samayno oo aan eegno waxa saldhiggu na siinayo tan. Xog-ururintu waxa ay ina siinaysaa laba ikhtiyaar oo aan ku fulin karno weydiimaha.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Doorashada koowaad waa codsi fudud. Maxaa ku wanaagsan? Xaqiiqda ah in aan qaadano oo u dirno, iyo wax kale oo dheeraad ah.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

https://github.com/pgjdbc/pgjdbc/pull/478

Xogta kaydku waxa kale oo ay leedahay waydiimo horumarsan, taas oo aad u dhib badan, laakiin aad u shaqaynaysa. Waxaad si gaar ah u diri kartaa codsi ku saabsan falanqaynta, fulinta, xidhitaan doorsooma, iwm.

Weydiinta aadka loo dheereeyey waa wax aynaan ku dabooli doonin warbixinta hadda jirta. Annagu, laga yaabee, inaan wax ka rabno keydka xogta iyo waxaa jira liis rabitaan ah oo la sameeyay qaab ahaan, ie. tani waa waxa aan rabno, laakiin suurtagal maaha hadda iyo sanadka soo socda. Markaa waanu duubnay oo waanu ku wareegaynaa oo dadka waaweyn ruxaynaa.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Waxa aan sameyn karnona waa weydiin fudud iyo weydiin dheerad ah.

Maxaa gaar ah oo ku saabsan hab kasta?

Weydiinta fudud waxay u fiican tahay fulinta hal mar. Mar la sameeyay oo la ilaaway. Dhibaataduna waxay tahay in aysan taageerin qaabka xogta binary, i.e. kuma haboona qaar ka mid ah nidaamyada waxqabadka sare.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Weydiinta la dheereeyey - waxay kuu oggolaaneysaa inaad waqti ku badbaadiso falanqaynta. Tani waa waxa aan samaynay oo aan bilownay isticmaalka. Tani runtii, runtii way na caawisay. Ma jiraan wax kayd ah oo kaliya oo ku saabsan falanqaynta. Waxaa jira kayd kayd ah oo ku saabsan wareejinta xogta. Ku wareejinta xogta qaabka binary aad ayey waxtar badan u leedahay.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Aan u gudubno ku celcelinta. Tani waa sida codsiga caadiga ah u eg yahay. Waxay noqon kartaa Java, iwm.

Waxaan abuurnay hadal. Fulinta amarka. Loo sameeyay meel dhow. Aaway khaladkii halkan ka dhacay? waa maxay dhibku? Dhib malahan Tani waa waxa ay ku leedahay dhammaan buugaagta. Sidan waa in loo qoraa. Haddii aad rabto waxqabadka ugu sarreeya, sidan u qor.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Laakiin dhaqanka ayaa muujiyay in tani aysan shaqaynayn. Waa maxay sababtu? Sababtoo ah waxaan leenahay hab "u dhow". Oo markaan tan samayno, marka laga eego dhinaca xogta xogta waxay soo baxaysaa inay la mid tahay sigaar cabbista oo la shaqeeya kaydka xogta. Waxa aanu nidhi "PARSE EXECUTE DEALLOCATE".

Waa maxay sababta intaas oo dhan abuurista iyo dejinta odhaahyada? Qofna uma baahna iyaga. Laakin waxa inta badan ka dhaca PreparedStatements waa marka aan xirno, ay xiraan wax walba oo ku jira keydka xogta. Tani maaha waxa aan rabno.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Waxaan rabnaa, sida dadka caafimaadka qaba, inaan la shaqeyno saldhigga. Hal mar ayaanu qaadanay oo diyaarinay bayaankeena, kadibna marar badan ayaanu fulinay. Dhab ahaantii, marar badan - tani waa hal mar nolosha codsiyada oo dhan - waa la soo bandhigay. Oo waxaan isticmaalnaa aqoonsi isku mid ah oo ku saabsan REST-yada kala duwan. Tani waa hadafkeena.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Sideen ku gaari karnaa tan?

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Aad bay u fududahay - looma baahna in la xidho bayaannada. Waxaan u qornaa sidatan: "diyaari" "fuliso".

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Haddii aan bilowno wax sidan oo kale ah, markaa way caddahay in ay wax ku qulquli doonaan meel. Haddii aysan caddayn, waxaad isku dayi kartaa. Aynu qorno bartilmaameed adeegsada habkan fudud. Abuur hadal. Waxaan ku bilownay qayb ka mid ah darawalka oo aanu ogaanay inuu si dhakhso ah u shilmay iyada oo lumisay dhammaan xusuusta ay lahayd.

Way caddahay in khaladaadka noocaas ah si fudud loo saxo. Ka hadli maayo iyaga. Laakiin waxaan sheegi doonaa in nooca cusubi uu si dhakhso leh u shaqeeyo. Habka waa doqonnimo, laakiin weli.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Sidee si sax ah loogu shaqeeyaa? Maxaan u baahanahay inaan tan u samayno?

Xaqiiqda, codsiyada had iyo jeer waxay xiraan bayaannada. Dhammaan buugaagta waxay yiraahdaan xir, haddii kale xusuusta ayaa daadi doonta.

PostgreSQL-na ma garanayo sida loo kaydiyo su'aalaha. Waa lagama maarmaan in fadhi kasta uu u abuuro kaydkan laftiisa.

Mana rabno inaan wakhti ku lumino falanqaynta sidoo kale.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Sida caadiga ahna waxaan haysanaa laba doorasho.

Doorashada koowaad waa in aan qaadano oo nidhaahno aan wax walba ku duubno PgSQL. Waxaa jira kayd Wax walba ayay kaydisaa. Waxay noqon doontaa mid weyn. Waxaan aragnay tan. Waxaan haynaa 100500 codsi. Ma shaqeeyo. Ma ogolin in codsiyada loo beddelo habraacyo gacanta. Maya maya.

Waxaan haysanaa ikhtiyaar labaad - qaado oo naftayada gooy. Waxaan furnaa ilaha oo waxaan bilownaa goynta. Waanu aragnay oo aragnay. Waxaa soo baxday in aysan sidaas u adkeyn in la sameeyo.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

https://github.com/pgjdbc/pgjdbc/pull/319

Tani waxay soo muuqatay Agoosto 2015. Hadda waxaa jira nooc kale oo casri ah. Wax walbana waa weyn yihiin. Si fiican ayey u shaqeysaa oo aanan waxba ka bedelin codsiga. Waxaan xitaa joojinay inaan ka fikirno jihada PgSQL, tusaale ahaan tani aad ayay noogu filnayd inaan hoos u dhigno dhammaan kharashaadka sare ilaa eber.

Sidaas awgeed, odhaahyada loo diyaariyey Server-ku waxa la hawlgeliyay fulinta 5-aad si looga fogaado in lagu lumiyo xusuusta kaydka ee codsi kasta oo hal mar ah.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Waxaa laga yaabaa inaad weydiiso - meeye tirooyinka? Maxaad helaysaa? Oo halkan kuma bixin doono tirooyin, sababtoo ah codsi kastaa wuxuu leeyahay u gaar ah.

Weydiimahayagu waxay ahaayeen kuwo aan ku kharash gareyno qiyaastii 20 millise seconds falanqaynta weydiimaha OLTP. Waxa jiray 0,5 millise ilbiriqsi oo la fulinayay, 20 millise ilbiriqsi si loo kala saaro. Codsi - 10 KiB oo qoraal ah, 170 khad oo qorshe ah. Kani waa codsi OLTP Waxay codsanaysaa 1, 5, 10 sadar, mararka qaarkoodna ka badan.

Laakiin ma aanan dooneynin inaan lumino 20 millise seconds gabi ahaanba. Waxaan ka dhignay 0. Wax walba waa weyn yihiin.

Maxaad ka qaadi kartaa halkan? Haddii aad haysato Java, markaa waxaad qaadataa nooca casriga ah ee darawalka oo ku faraxsan.

Haddii aad ku hadasho luqad kale, ka dib ka fikir - ma laga yaabaa inaad sidoo kale u baahan tahay tan? Sababtoo ah marka laga eego dhinaca luqadda kama dambaysta ah, tusaale ahaan, haddii PL 8 ama aad leedahay LibPQ, markaa ma muuqato inaadan waqti ku bixinaynin fulinta, falanqaynta, taasina waa mid mudan in la hubiyo. Sidee? Wax walba waa bilaash.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Marka laga reebo in ay jiraan khaladaad iyo qaar u gaar ah. Oo hadda waan ka hadli doonaa iyaga. Inta badan waxay ku saabsan tahay qadiimiga warshadaha, wixii aan helnay, waxa aan la kulannay.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Haddii codsiga loo soo saaro si firfircoon. Way dhacdaa. Qof ayaa isku dhejiya xadhkaha, taasoo keentay su'aal SQL ah.

Muxuu u xun yahay? Way xun tahay sababtoo ah mar kasta oo aan ku dhammaanno xadhig ka duwan.

Oo hashCode ee xadhigan kala duwan wuxuu u baahan yahay in dib loo akhriyo. Tani runtii waa hawl CPU - helida qoraal dheer oo codsi ah xitaa xashiish jira ma fududa. Sidaa darteed, gunaanadku waa mid fudud - ha dhalin codsiyo. Ku kaydi hal doorsoome. Farxadna.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Dhibaatada xigta. Noocyada xogtu waa muhiim. Waxaa jira ORM-yada sheegaya in aysan macno lahayn nooca NULL ee jira, ha jiro nooc ka mid ah. Haddii Int, markaa waxaan dhahnaa setInt. Hadday NULL, markaas had iyo jeer ha ahaato VARCHAR. Maxayse ku kala duwan tahay dhamaadka waxa NULL jira? Xogta xogta lafteeda ayaa fahmi doonta wax walba. Oo sawirkani ma shaqaynayo.

Ficil ahaan, xog-ururinta waxba dan uma laha. Haddii aad markii ugu horreysay sheegtay in kani yahay lambar, marka labaadna aad tiraahdo waa VARCHAR, markaa suurtagal maaha in dib loo isticmaalo odhaahyada Server-ku diyaariyey. Xaaladdan oo kale, waa inaan dib u abuurnaa bayaankeena.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Haddii aad fulinayso su'aal isku mid ah, hubi in noocyada xogta ee tiirarkaagu aanay ku wareersanayn. Waxaad u baahan tahay inaad iska ilaaliso NULL. Tani waa khalad caadi ah oo na soo maray ka dib markii aan bilownay isticmaalka PreparedStatements

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Hagaag, shid Malaha waxay qaateen darawalkii. Wax soo saarkiina hoos buu u dhacay. Arrimuhu way xumaadeen.

Sidee tani u dhacdaa? Kani ma bug mise sifo? Nasiib darro, suurtagal ma ahayn in la fahmo in tani ay tahay cillad ama sifo. Laakiin waxaa jira xaalad aad u fudud oo dib u soo saarista dhibaatadan. Waxay gabi ahaanba si lama filaan ah nagu soo qaaday. Waxayna ka kooban tahay muunad macno ahaan hal miis laga soo qaaday. Waxaan, dabcan, haysanay codsiyo noocaas oo kale ah. Sida caadiga ah, waxay ku jireen laba ama saddex miis, laakiin waxaa jira muuqaal dib-u-ciyaarid ah. Nooc kasta ka soo qaado xogtaada oo ciyaar.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

Ujeedadu waxay tahay in aan leenahay laba tiir oo mid kastaa la tilmaamo. Waxa jira hal milyan oo saf oo ku jira hal tiir NULL. Tiirka labaadna wuxuu ka kooban yahay 20 sadar oo keliya. Marka aan fulino doorsoomayaal la'aan, wax walba si fiican ayey u shaqeeyaan.

Haddii aan ku bilowno fulinta doorsoomayaasha xidhan, i.e. waxaan fulinaa "?" ama "$1" codsigeena, maxaan helaynaa?

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

Xukunka ugu horreeya waa sida la filayo. Midka labaad wuu yara dheereeyaa. Wax baa la kaydiyay Saddexaad, afraad, shanaad. Kadibna garaac - iyo wax la mid ah. Midda ugu daranna waa in tani ay dhacdo xukunka lixaad. Yaa ogaa inay lagama maarmaan tahay in la sameeyo lix dil oo sax ah si loo fahmo waxa qorshaha fulinta dhabta ah uu yahay?

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Yaa dambiile ah? Maxaa dhacay? Kaydka xogta waxa ku jira wanaajinta Waxayna u muuqataa in loo wanaajinayo kiiska guud. Oo, sidaas awgeed, laga bilaabo mar uun, waxay u beddeshaa qorshe guud, kaas oo, nasiib daro, laga yaabo inuu noqdo mid ka duwan. Waxaa laga yaabaa inay isku mid noqoto, ama way ka duwanaan kartaa. Oo waxaa jira nooc ka mid ah qiimaha marinnada u horseedaya habdhaqankan.

Maxaad ka qaban kartaa? Halkan, dabcan, way adag tahay in wax la qaato. Waxaa jira xal fudud oo aan isticmaalno. Tani waa +0, OFFSET 0. Hubaal waad garanaysaa xalalka noocaas ah. Kaliya waan qaadaneynaa oo ku darnaa "+0" codsiga wax walbana waa hagaagsan yihiin. dib ayaan ku tusi doonaa

Oo waxaa jira ikhtiyaar kale - si taxadar leh u eeg qorshayaasha. Horumariyuhu waa inuusan qorin codsi oo kaliya, laakiin sidoo kale waa inuu dhahaa "sharax falanqeyn" 6 jeer. Haddii ay tahay 5, ma shaqeyn doonto.

Oo waxaa jira ikhtiyaar saddexaad - warqad u qor pgsql-hackers. Waan qoray, si kastaba ha ahaatee, weli ma cadda in tani ay tahay bug ama sifo.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

https://gist.github.com/vlsi/df08cbef370b2e86a5c1

Inta aan ka fekereyno in tani ay tahay cillad ama sifo, aan hagaajino. Aynu qaadano codsigeena oo aan ku darno "+0". Wax walba waa fiican yihiin. Laba calaamad oo aanad xitaa ka fikirin sida ay tahay ama waxa ay tahay. Aad u fudud. Waxaan si fudud uga mamnuucnay keydka xogta isticmaalka tusaha tiirkan. Ma hayno tusaha tiirka "+0" waana taas, keydka xogta ma isticmaalo tusaha, wax walba waa fiican yihiin.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Tani waa qaanuunka 6 sharax. Hadda noocyada hadda jira waa inaad sameysaa 6 jeer haddii aad leedahay doorsoomayaal xidhan. Haddii aanad lahayn doorsoomayaal xidhan, tani waa waxa aanu samayno. Iyo dhamaadka waa sida saxda ah codsigan uu ku guuldareysto. Ma ahan shay qalafsan.

Waxay u muuqan lahayd, intee in le'eg ayaa suurtagal ah? Kutaan halkan, bug halkaas. Dhab ahaantii, cayayaanka ayaa meel walba yaal.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Aan si hoose u eegno. Tusaale ahaan, waxaan leenahay laba schema. Qorshaha A oo leh miiska S iyo jaantuska B oo leh miiska S. Weydiinta – ka dooro xogta shaxda. Maxaan haysan doonaa kiiskan? Waxaan yeelan doonaa qalad. Waxaan yeelan doonaa dhammaan kuwa kor ku xusan. Xeerku waa - bug ayaa meel walba yaal, waxaan yeelan doonaa dhammaan kuwa kor ku xusan.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Hadda su'aashu waa: "Sabab?" Waxay u ekaan kartaa inay jiraan dukumeenti haddii aan leenahay schema, ka dib waxaa jira doorsoome "dariiqa raadinta" oo noo sheegaya meesha aan ka raadineyno miiska. Waxay u egtahay in uu jiro doorsoome.

waa maxay dhibku? Dhibaatadu waxay tahay in weedhaha loo diyaariyey server-ka aysan ka shakin in search_path uu qof bedeli karo. Qiimahani wuxuu ahaanayaa, sida ay ahayd, joogto ah xogta xogta. Qaybaha qaarna waxa laga yaabaa in aanay macne cusub soo qaadan.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Dabcan, tani waxay ku xidhan tahay nooca aad tijaabinayso. Waxay kuxirantahay sida dhabta ah ee miisaskaagu u kala duwan yahay. Iyo nooca 9.1 ayaa si fudud u fulin doona weydiimihii hore. Noocyo cusub ayaa laga yaabaa inay qabtaan cayayaanka oo ay kuu sheegaan inaad qabto bug.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Deji search_path + weedho la diyaariyey server-ka =
Qorshaha kaydsan waa inuusan bedelin nooca natiijada

Sidee loo daaweeyaa? Waxaa jira cunto kariye fudud - ha samayn. Looma baahna in la beddelo search_path inta codsigu socdo. Haddii aad bedesho, waxaa fiican inaad abuurto xiriir cusub.

Waad ka doodi kartaa, tusaale ahaan fur, dood, ku dar. Waxaa laga yaabaa inaan ku qancin karno horumariyeyaasha xogta in marka qof beddelo qiimaha, kaydinta xogta waa inay u sheegto macmiilka tan: "Fiiri, qiimahaaga halkan ayaa lagu cusboonaysiiyay. Ma laga yaabaa inaad u baahato inaad dib u dejiso bayaannada oo aad dib u abuurto? Hadda database-ku wuxuu u dhaqmaa si qarsoodi ah oo sinaba uma soo sheego in bayaannada ay beddeleen meel gudaha ah.

Oo waxaan mar kale xoogga saari doonaa - tani waa wax aan caadi ahayn Java. Waxaan ku arki doonaa wax la mid ah PL/pgSQL mid ka mid ah. Laakiin halkaas ayaa lagu soo saari doonaa.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Aynu isku dayno xulasho xog badan. Anaga ayaa dooranayna. Waxaan leenahay miis leh hal milyan oo saf. Xariiq kastaa waa kiiloobyte. Ku dhawaad ​​gigabyte xog ah. Oo waxaan ku haynaa xusuusta shaqaynaysa mashiinka Java ee 128 megabyte.

Annagu, sida lagu taliyay dhammaan buugaagta, waxaanu isticmaalnaa habaynta socodka. Taasi waa, waxaanu furaynaa resultSet oo aanu wax yar ka akhrinay xogta halkaas. Ma shaqayn doontaa? Ma ka dhici doontaa xusuusta? Wax yar ma akhrin doontaa? Aynu aamino kaydka xogta, aynu ku kalsoonaano Postgres. Ma aaminsanin. Ma ka dhacaynaa OutOFMemory? Yaa la kulmay OutOfMemory? yaa ku guulaystay inuu hagaajiyo intaa ka dib? Qof ayaa ku guuleystay inuu hagaajiyo.

Haddii aad haysato hal milyan oo saf, ma dooran kartid oo kaliya. OFFSET/LIMIT ayaa loo baahan yahay. Yaa u ah doorashadan? Oo yaa jecel inuu ku ciyaaro autoCommit?

Halkan, sida caadiga ah, ikhtiyaarka lama filaanka ah ayaa soo noqda mid sax ah. Oo haddii aad si lama filaan ah u damiso autoCommit, way ku caawin doontaa. Waa maxay sababtu? Saynis waxba kama oga arrintan.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Laakiin sida caadiga ah, dhammaan macaamiisha ku xidhan xogta Postgres waxay keenaan xogta oo dhan. PgJDBC kama reebna arrintan; waxay doorataa dhammaan safafka.

Waxaa jira kala duwanaansho ku saabsan mawduuca FetchSize, i.e. waxaad dhihi kartaa heerka bayaan gaar ah halkan, fadlan ku dooro xogta 10, 50. Laakiin tani ma shaqeyneyso ilaa aad damiso autoCommit. Demiyay autoCommit - waxay bilaabataa shaqada.

Laakin dhex mara koodka iyo dejinta setFetchSize meel kasta waa dhib. Sidaa darteed, waxaanu samaynay goob odhan doonta qiimaha caadiga ah ee xidhiidhka oo dhan.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Sidaas ayaanu ku nidhi. Halbeegga waa la habeeyey Maxaase naga helay? Haddii aan dooranno qaddar yar, haddii, tusaale ahaan, aan dooranno 10 saf markiiba, markaa waxaan haysanaa kharashyo badan oo dheeraad ah. Sidaa darteed, qiimahan waa in la dejiyaa ilaa boqol.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Fikrad ahaan, dabcan, weli waa inaad barataa sida loo xaddido bytes, laakiin cuntada la kariyey waa tan: deji RowFetchSize in ka badan boqol oo ku faraxsanow.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Aan u gudubno gelinta xogta. Gelida way fududahay, waxaa jira doorashooyin kala duwan. Tusaale ahaan, INSERT, VALUES. Tani waa doorasho wanaagsan. Waxaad odhan kartaa "GALI XUL" Ficil ahaan waa isku mid. Ma jiro farqi u dhexeeya waxqabadka.

Buugaagtu waxay yiraahdaan waxaad u baahan tahay inaad fuliso bayaan Dufcaddii, buugaagtu waxay yiraahdaan waxaad ku fulin kartaa amaro kakan oo dhowr ah. Postgres-na waxay leedahay sifo cajiib ah - waxaad samayn kartaa nuqul ka mid ah, tusaale ahaan dhaqso u samee.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Haddii aad cabbirto, waxaad mar kale samayn kartaa sahanno xiiso leh. Sideen rabnaa in tani u shaqeyso? Waxaan rabnaa in aynaan kala saarin oo aynaan fulin amarrada aan loo baahnayn.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Ficil ahaan, TCP ma ogola inaan tan samayno. Haddii macmiilku ku mashquulsan yahay dirida codsi, markaa xog ururintu ma akhriyo codsiyada isku day in ay jawaabaha noo soo dirto. Natiijada kama dambaysta ahi waa in macmiilku sugayo kaydka xogta si uu u akhriyo codsiga, kaydkuna waxa uu sugayaa macmiilku inuu akhriyo jawaabta.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Sidaas darteed macmiilku waxa uu ku qasban yahay in uu si xilliyo ah u soo diro xidhmo wada shaqayneed. Isdhexgalka shabakada dheeraadka ah, waqti lumis dheeraad ah.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir SitnikovIntaynu ku darnona way sii xumaanaysaa. Darawalku aad buu u niyad jabsan yahay oo marar badan ayuu ku daraa, qiyaastii hal mar 200 oo sadar, taas oo ku xidhan inta ay le'eg yihiin khadadka, iwm.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

https://github.com/pgjdbc/pgjdbc/pull/380

Waxay dhacdaa inaad saxdo hal xariiq oo kaliya wax walbana waxay dadajin doonaan 10 jeer. Way dhacdaa. Waa maxay sababtu? Sida caadiga ah, joogto ah sidan oo kale ayaa mar hore loo isticmaalay meel. Iyo qiimaha "128" macnaheedu waa inaan la isticmaalin baking.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Xakamaynta microbenchmark Java

Way fiicantahay in tan aan lagu darin nooca rasmiga ah. La helay ka hor intaan la sii dayn. Dhammaan macnayaasha aan bixiyo waxay ku saleysan yihiin noocyada casriga ah.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Aynu isku dayno. Waxaan cabbirnaa InsertBatch si fudud. Waxaan cabbirnaa InsertBatch dhowr jeer, ie. isla shay, laakiin waxaa jira qiyam badan. Dhaqdhaqaaq khiyaano leh. Qof kastaa ma samayn karo tan, laakiin waa dhaqaaq fudud, oo aad uga fudud nuqulka.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Waxaad samayn kartaa COPY.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Taasna waxaad ku samayn kartaa dhismayaal. Ku dhawaaq nooca caadiga ah ee isticmaale, gudbi array oo si toos ah miiska u geli.

Haddii aad furto isku xirka: pgjdbc/ubenchmsrk/InsertBatch.java, markaa koodkan wuxuu yaal GitHub. Waxaad si gaar ah u arki kartaa codsiyada halkaas laga keenay. Dhib malaha.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Waxaan bilaabay. Waxa ugu horreeya ee aan ogaanay waxay ahayd in isticmaalka dufcadda ay tahay wax aan macquul ahayn. Dhammaan xulashooyinka kooxdu waa eber, tusaale ahaan waqtiga fulinta waa eber marka la barbar dhigo mid hal mar ah.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Waxaan gelineynaa xogta. Waa miis aad u fudud. Saddex tiir. Oo maxaan ku aragnaa halkan? Waxaan aragnaa in dhammaan saddexdan doorasho ay qiyaas ahaan is barbar dhig ku yihiin. COPY-na dabcan, waa ka fiican yahay.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Tani waa marka aan gelinno qaybo. Markaynu nidhi hal qiyam, laba qiyam, saddex qiyam, ama aynu tilmaanay 10 ka mid ah oo ay kala soocaan jumlad. Tani hadda waa jiif. 1, 2, 4, 128. Waxaa la arki karaa in Dufcaddii Insert, oo lagu sawiray buluug, ay dareensiiso inuu aad u fiicnaado. Taasi waa, marka aad mid mid geliso ama xitaa marka aad afar geliso, waxay noqonaysaa laba jeer oo wanaagsan, sababtoo ah waxaan ku sii dhejinnay wax yar oo qiyam ah. Hawlgallada EXECUTE oo yar

Isticmaalka COPY ee qiyaasaha yaryar aad bay rajo u lahayn. Xataa ma sawiran labada hore. Waxay gelayaan jannada, yacni, tirooyinkan cagaarka ah ee COPY.

COPY waa in la isticmaalo marka aad haysato ugu yaraan boqol saf oo xog ah. Dusha sare ee furitaanka xidhiidhkani waa weyn yahay. Oo, si daacad ah, ma aan qodin dhinacan. Waxaan hagaajiyay Dufcaddii, laakiin ma koobin.

Maxaan samaynaa marka xigta? Waanu isku daynay. Waxaan fahansanahay inaan u baahanahay inaan isticmaalno qaab dhismeedyo ama bac xariif ah oo dhowr macne isugu jira.

PostgreSQL iyo JDBC waxay tuujiyaan dhammaan casiirka. Vladimir Sitnikov

Maxaad ka qaadanaysaa warbixinta maanta?

  • PreparedStatement waa wax walba. Tani waxay siinaysaa wax badan oo wax soo saarka. Waxay soo saartaa flop weyn oo cadarka ah.
  • Oo waxaad u baahan tahay inaad sharaxdo 6 jeer.
  • Oo waxaan u baahanahay inaan milicsano OFFSET 0, iyo tabaha sida +0 si loo saxo boqolkiiba inta hadhay ee weydiimahayaga dhibaatada leh.

Source: www.habr.com

Add a comment