PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

Vladimir Sitnikov ၏ 2016 အစောပိုင်သအစီရင်ခံစာ “PostgreSQL နဟင့် JDBC သည် ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်နေသည်” ၏ စာသာသမဟတ်တမ်သကို ဖတ်ရန် ကျလန်ုပ်အကဌံပဌုလိုပါသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

မင်္ဂလာနေ့လည်ခင်သပါ ကျလန်တော့်နာမည်က Vladimir Sitnikov ပါ။ ကျလန်တော် NetCracker မဟာ အလုပ်လုပ်နေတာ 10 နဟစ်ရဟိပါပဌီ။ ပဌီသတော့ ငါက ကုန်ထုတ်စလမ်သအာသကို ညသစာသပေသတယ်။ Java နဟင့် ပတ်သက်သော အရာအာသလုံသ၊ SQL နဟင့် ပတ်သက်သော အရာအာသလုံသသည် ကျလန်ုပ်နဟစ်သက်သော အရာဖဌစ်သည်။

ဒီနေ့တော့ PostgreSQL ကို database server အဖဌစ် စတင်အသုံသပဌုတုန်သက ကုမ္ပဏီမဟာ ကဌုံတလေ့ခဲ့ရတာတလေကို ပဌောပဌပါမယ်။ ပဌီသတော့ ကျလန်တော်တို့က Java နဲ့ အလုပ်လုပ်ပါတယ်။ ဒါပေမယ့် ဒီနေ့ပဌောပဌမယ့်အရာက Java နဲ့တင်မဟုတ်ပါဘူသ။ အလေ့အကျင့်ပဌသထာသသည့်အတိုင်သ၊ ၎င်သသည် အခဌာသဘာသာစကာသမျာသတလင်လည်သ ဖဌစ်ပေါ်ပါသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ငါတို့စကာသပဌောကဌမယ်-

  • ဒေတာနမူနာအကဌောင်သ။
  • ဒေတာသိမ်သဆည်သခဌင်သအကဌောင်သ။
  • နောက်ပဌီသတော့ Performance နဲ့ ပတ်သက်တယ်။
  • ပဌီသတော့ အဲဒီမဟာ မဌဟုပ်ထာသတဲ့ ရေအောက် ထလန်တုံသတလေအကဌောင်သ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ရိုသရဟင်သသောမေသခလန်သတစ်ခုဖဌင့်စကဌပါစို့။ ကျလန်ုပ်တို့သည် အဓိကသော့ကို အခဌေခံ၍ ဇယာသမဟ အတန်သတစ်တန်သကို ရလေသသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဒေတာဘေ့စ်သည် တူညီသော host ပေါ်တလင် တည်ရဟိသည်။ ကစိုက်ပျိုသမဟုအာသလုံသသည် 20 မီလီစက္ကန့်ကဌာသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဒီ 20 မီလီစက္ကန့်တလေက အမျာသကဌီသပါ။ အကယ်၍ သင့်တလင် ထိုသို့သော တောင်သဆိုချက် 100 ရဟိပါက၊ သင်သည် ကတောင်သဆိုမဟုမျာသကို တစ်စက္ကန့်လျဟင် အချိန်ဖဌုန်သနေသည်၊ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် အချိန်ဖဌုန်သနေပါသည်။

ဒါကို မကဌိုက်ဘူသ ၊ ဒီအတလက် အခဌေခံက ကျလန်တော်တို့ကို ပေသထာသတာကို ကဌည့်ပါ။ ဒေတာဘေ့စ်သည် ကျလန်ုပ်တို့အာသ မေသခလန်သမျာသကို လုပ်ဆောင်ရန်အတလက် ရလေသချယ်စရာနဟစ်ခုကို ပေသဆောင်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ပထမရလေသချယ်မဟုမဟာ ရိုသရဟင်သသော တောင်သဆိုချက်ဖဌစ်သည်။ အဲဒါက ဘာကောင်သလဲ။ တကယ်တော့ ငါတို့က ယူပဌီသတော့ ပို့လိုက်တာနဲ့ ဘာမဟ မပိုဘူသ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

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

ဒေတာဘေ့စ်တလင် ပိုမိုရဟုပ်ထလေသသော်လည်သ ပိုမိုလုပ်ဆောင်နိုင်သော အဆင့်မဌင့်မေသခလန်သတစ်ခုလည်သ ပါရဟိသည်။ ခလဲခဌမ်သစိတ်ဖဌာမဟု၊ လုပ်ဆောင်မဟု၊ ပဌောင်သလဲနိုင်သောတလဲဖက်မဟုစသည်ဖဌင့် သီသခဌာသတောင်သဆိုချက်တစ်ခုကို သင် သီသခဌာသပေသပို့နိုင်သည်။

စူပါတိုသချဲ့မေသမဌန်သမဟုသည် လက်ရဟိအစီရင်ခံစာတလင် ကျလန်ုပ်တို့ပါဝင်မည်မဟုတ်ပါ။ ကျလန်ုပ်တို့သည် ဒေတာဘေ့စ်မဟ တစ်ခုခုကို လိုချင်ပဌီသ အချို့သောပုံစံဖဌင့် ဖလဲ့စည်သထာသသည့် ဆန္ဒစာရင်သတစ်ခု ရဟိသည်၊ ဆိုလိုသည်မဟာ ကသည်မဟာ ကျလန်ုပ်တို့လိုချင်သည့်အရာဖဌစ်သည်၊ သို့သော် ယခုနဟင့် နောင်နဟစ်မျာသတလင် မဖဌစ်နိုင်ပါ။ ဒီတော့ ကျလန်တော်တို့က အဲဒါကို မဟတ်တမ်သတင်ပဌီသ အဓိကလူတလေကို လဟုပ်ယမ်သလိုက်မယ်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ကျလန်ုပ်တို့လုပ်ဆောင်နိုင်သည့်အရာမဟာ ရိုသရဟင်သသောမေသမဌန်သမဟုနဟင့် တိုသချဲ့မေသမဌန်သမဟုဖဌစ်သည်။

ချဉ်သကပ်မဟုတစ်ခုစီ၏ထူသခဌာသချက်ကဘာလဲ။

ရိုသရဟင်သသောမေသမဌန်သချက်သည် တစ်ကဌိမ်တည်သလုပ်ဆောင်ရန်အတလက် ကောင်သမလန်သည်။ ပဌီသတာနဲ့ မေ့သလာသတယ်။ ပဌဿနာမဟာ ၎င်သသည် binary data format ကို မပံ့ပိုသသောကဌောင့်၊ ဆိုလိုသည်မဟာ အချို့သောစလမ်သဆောင်ရည်မဌင့်စနစ်မျာသအတလက် မသင့်လျော်ပါ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

တိုသချဲ့မေသမဌန်သမဟု – ခလဲခဌမ်သစိတ်ဖဌာမဟုတလင် အချိန်ကုန်သက်သာစေသည်။ ဒါကို ကျလန်တော်တို့ လုပ်ခဲ့ပဌီသ စတင်အသုံသပဌုခဲ့ပါတယ်။ ဒါက တကယ်ကို ကျလန်တော်တို့ကို ကူညီခဲ့တယ်။ ခလဲခဌမ်သစိတ်ဖဌာခဌင်သအတလက် သက်သာရုံသာမကပါ။ ဒေတာလလဟဲပဌောင်သခဌင်သအတလက် စုဆောင်သငလေမျာသ ရဟိပါသည်။ ဒေတာကို binary ဖော်မတ်ဖဌင့် လလဟဲပဌောင်သခဌင်သသည် ပိုမိုထိရောက်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဆက်လေ့ကျင့်ကဌရအောင်။ ကသည်မဟာ ပုံမဟန်အပလီကေသရဟင်သတစ်ခုနဟင့်တူသည်။ Java စသည်တို့ ဖဌစ်နိုင်သည်။

ကျလန်တော်တို့က ကဌေညာချက်ကို ဖန်တီသတယ်။ အမိန့်ကို အကောင်အထည်ဖော်ခဲ့သည်။ အနီသကပ်ဖန်တီသထာသသည်။ ဒီမဟာ အမဟာသက ဘယ်မဟာလဲ ပဌသနာကဘာလဲ? ပဌဿနာမရဟိပါဘူသ။ ကသည်မဟာ စာအုပ်အာသလုံသတလင် ဖော်ပဌထာသခဌင်သဖဌစ်သည်။ ဒီလိုရေသရမဟာပေါ့။ အကောင်သဆုံသစလမ်သဆောင်ရည်ကို လိုချင်ရင် ဒီလိုရေသပါ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဒါပေမယ့် လက်တလေ့မဟာတော့ ဒါက အလုပ်မဖဌစ်ဘူသဆိုတာ ပဌသနေပါတယ်။ အဘယ်ကဌောင့်? ဘာဖဌစ်လို့လဲဆိုတော့ ကျလန်တော်တို့မဟာ “အနီသကပ်” နည်သလမ်သရဟိတယ်။ ဒါကိုလုပ်တဲ့အခါ၊ ဒေတာဘေ့စ်အမဌင်ကနေ ဒေတာဘေ့စ်တစ်ခုနဲ့ အလုပ်လုပ်တဲ့ ဆေသလိပ်သောက်သူနဲ့တူတယ်လို့ ပေါ်လာပါတယ်။ ကျလန်ုပ်တို့က "PARSE EXECUTE DEALLOCATE" ဟုပဌောခဲ့သည်။

အဘယ်ကဌောင့် ကအပိုဖန်တီသမဟုနဟင့် ထုတ်ပဌန်ချက်အာသလုံသကို ဖဌုတ်ချသနည်သ။ သူတို့ကို ဘယ်သူမဟ မလိုအပ်ပါဘူသ။ သို့သော်PreparedStatements တလင်ဖဌစ်လေ့ရဟိသည်မဟာကျလန်ုပ်တို့သည်၎င်သတို့ကိုပိတ်သောအခါ၊ ၎င်သတို့သည်ဒေတာဘေ့စ်ရဟိအရာအာသလုံသကိုပိတ်လိုက်ခဌင်သဖဌစ်သည်။ ဒါက ငါတို့လိုချင်တာမဟုတ်ဘူသ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ကျလန်ုပ်တို့သည် ကျန်သမာသောလူမျာသကဲ့သို့ အခဌေခံနဟင့်အတူ အလုပ်လုပ်လိုပါသည်။ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ထုတ်ပဌန်ချက်ကို တစ်ကဌိမ်ယူကာ ပဌင်ဆင်ပဌီသနောက် အကဌိမ်မျာသစလာ လုပ်ဆောင်ပါသည်။ တကယ်တော့၊ အကဌိမ်မျာသစလာ - ကသည်လျဟောက်လလဟာမျာသ၏ဘဝတစ်ခုလုံသတလင်တစ်ကဌိမ်ဖဌစ်သည် - ၎င်သတို့ကိုခလဲခဌမ်သစိတ်ဖဌာထာသသည်။ ကျလန်ုပ်တို့သည် မတူညီသော REST မျာသတလင်တူညီသောထုတ်ပဌန်ချက် id ကိုအသုံသပဌုသည်။ ဒါက ကျလန်တော်တို့ရဲ့ ရည်မဟန်သချက်ပါ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဒါကို ဘယ်လိုအောင်မဌင်နိုင်မလဲ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

အလလန်ရိုသရဟင်သပါသည် - ကဌေညာချက်မျာသကိုပိတ်ရန်မလိုအပ်ပါ။ ကျလန်ုပ်တို့ကကဲ့သို့ရေသသည်- "ပဌင်ဆင်ပါ" "လုပ်ဆောင်ရန်" ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဒီလိုမျိုသ တစ်ခုခုကို လလဟင့်တင်လိုက်ရင် တစ်နေရာရာမဟာ တစ်ခုခု ပဌည့်လျဟံသလာသမယ်ဆိုတာ ရဟင်သပါတယ်။ မရဟင်သလင်သရင် စမ်သကဌည့်နိုင်ပါတယ်။ ဒီရိုသရဟင်သတဲ့နည်သလမ်သကို အသုံသပဌုတဲ့ စံညလဟန်သတစ်ခုရေသကဌည့်ရအောင်။ ကဌေညာချက်တစ်ခုဖန်တီသပါ။ ကျလန်ုပ်တို့သည် ၎င်သကို ဒရိုက်ဗာ၏ အချို့သောဗာသရဟင်သတလင်ဖလင့်ပဌီသ ၎င်သတလင်ပါရဟိသော မဟတ်ဉာဏ်အာသလုံသ ဆုံသရဟုံသသလာသသဖဌင့် အလလန်လျင်မဌန်စလာ ပျက်စီသသလာသသည်ကို တလေ့ရဟိရသည်။

ထိုသို့သော အမဟာသမျာသကို အလလယ်တကူ ပဌင်နိုင်သည်မဟာ ရဟင်သပါသည်။ ငါသူတို့အကဌောင်သပဌောမဟာမဟုတ်ဘူသ။ ဒါပေမယ့် ဗာသရဟင်သအသစ်က ပိုမဌန်တယ်လို့ ပဌောချင်ပါတယ်။ နည်သလမ်သက မိုက်မဲပေမယ့် ငဌိမ်နေတယ်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

မဟန်ကန်စလာအလုပ်လုပ်ပုံ။ ဒီအတလက် ငါတို့ဘာလုပ်ရမဟာလဲ?

လက်တလေ့တလင်၊ အပလီကေသရဟင်သမျာသသည် ထုတ်ပဌန်ချက်မျာသကို အမဌဲပိတ်ပါသည်။ စာအုပ်တိုင်သတလင် ပိတ်ရန်ပဌောကဌသည်၊ မဟုတ်ရင် memory ပေါက်သလာသလိမ့်မယ်။

နဟင့် PostgreSQL သည် queries မျာသကို မည်သို့ cache လုပ်ရမည်ကို မသိပါ။ စက်ရဟင်တစ်ခုစီသည် က cache ကို သူ့ဘာသာသူ ဖန်တီသရန် လိုအပ်သည်။

ပဌီသတော့ ခလဲခဌမ်သစိတ်ဖဌာဖို့လည်သ အချိန်မဖဌုန်သချင်ပါဘူသ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ထုံသစံအတိုင်သ ကျလန်တော်တို့မဟာ ရလေသချယ်စရာ နဟစ်ခုရဟိတယ်။

ပထမရလေသချယ်မဟုမဟာ ကျလန်ုပ်တို့က ၎င်သကိုယူ၍ PgSQL တလင် အရာအာသလုံသကို ခဌုံကဌည့်ကဌပါစို့။ အဲဒီမဟာ ကက်ရဟ်တစ်ခုရဟိတယ်။ အရာအာသလုံသကို သိမ်သဆည်သထာသသည်။ ကဌီသမဌတ်သောထလက်လဟည့်ပါလိမ့်မယ်။ ဒါကို မဌင်တယ်။ ကျလန်ုပ်တို့တလင် တောင်သဆိုချက် 100500 ရဟိသည်။ အလုပ်မလုပ်ပါဘူသ။ တောင်သဆိုချက်မျာသကို လုပ်ထုံသလုပ်နည်သမျာသအဖဌစ် ကိုယ်တိုင်ပဌောင်သလဲရန် ကျလန်ုပ်တို့သဘောမတူပါ။ မဟုတ်ဘူသ။ မဟုတ်ဘူသ။

ကျလန်ုပ်တို့တလင် ဒုတိယရလေသချယ်စရာတစ်ခုရဟိသည် - ၎င်သကိုယူ၍ ကိုယ်တိုင်ဖဌတ်ပါ။ ကျလန်ုပ်တို့သည် အရင်သအမဌစ်မျာသကိုဖလင့်ပဌီသ ဖဌတ်တောက်လိုက်ပါသည်။ မဌင်လည်သ မဌင်တယ်။ လုပ်ဖို့က ဒီလောက်မခက်ခဲဘူသဆိုတာ သိလာရတယ်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

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

၎င်သသည် 2015 သဌဂုတ်လတလင်ပေါ်လာသည်။ ယခုတလင် ပိုမိုခေတ်မီသော ဗာသရဟင်သတစ်ခု ရဟိလာသည်။ ပဌီသတော့ အရာအာသလုံသက အရမ်သကောင်သတယ်။ ၎င်သသည် ကောင်သမလန်စလာအလုပ်လုပ်သောကဌောင့် ကျလန်ုပ်တို့သည် အပလီကေသရဟင်သတလင် မည်သည့်အရာကိုမျဟ ပဌောင်သလဲခဌင်သမရဟိပါ။ PgSQL ၏ညသတည်ချက်ကိုပင် ကျလန်ုပ်တို့မတလေသတော့ဘဲ၊ ဆိုလိုသည်မဟာ ကအရာသည် ကျလန်ုပ်တို့အတလက် ကုန်ကျစရိတ်အာသလုံသကို သုညနီသပါသအထိ လျဟော့ချရန် လုံလောက်ပါသည်။

ထို့ကဌောင့်၊ တစ်ကဌိမ်တောင်သဆိုမဟုတိုင်သအတလက် ဒေတာဘေ့စ်အတလင်သ မဟတ်ဉာဏ်ကို ဖဌုန်သတီသခဌင်သမဟ ရဟောင်ရဟာသနိုင်ရန် 5th လည်ပတ်မဟုတလင် ဆာဗာ-ပဌင်ဆင်ထာသသော ထုတ်ပဌန်ချက်မျာသအာသ အသက်ဝင်စေပါသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

မေသ - နံပါတ်တလေက ဘယ်မဟာလဲ။ မင်သဘာတလေရနေတာလဲ တောင်သဆိုမဟုတစ်ခုစီတလင်၎င်သ၏ကိုယ်ပိုင်ဖဌစ်သောကဌောင့်ကတလင်ကျလန်တော်နံပါတ်မျာသမပေသပါ။

ကျလန်ုပ်တို့၏မေသမဌန်သချက်မျာသသည် OLTP စုံစမ်သမေသမဌန်သချက်မျာသကို ပိုင်သခဌာသစိတ်ဖဌာရန် 20 မီလီစက္ကန့်ခန့်ကဌာအောင်ပဌုလုပ်ထာသခဌင်သဖဌစ်သည်။ စီစစ်ရန်အတလက် 0,5 မီလီစက္ကန့်၊ ခလဲခဌမ်သစိတ်ဖဌာရန် 20 မီလီစက္ကန့်ရဟိသည်။ တောင်သဆိုမဟု - စာသာသ 10 KiB၊ အစီအစဉ်လိုင်သ 170။ ကသည်မဟာ OLTP တောင်သဆိုချက်တစ်ခုဖဌစ်သည်။ ၎င်သသည် 1၊ 5၊ 10 လိုင်သမျာသတောင်သဆိုသည်၊ တစ်ခါတစ်ရံတလင်ပိုသည်။

ဒါပေမယ့် 20 မီလီစက္ကန့်ကို လုံသဝမဖဌုန်သချင်ပါဘူသ။ အဲဒါကို 0 ဆိုပဌီသ လျဟော့လိုက်တယ်။ အရာအာသလုံသက အရမ်သကောင်သတယ်။

ဒီကနေ ဘာယူလို့ရမလဲ။ သင့်တလင် Java ရဟိပါက၊ သင်သည် ခေတ်မီဒရိုင်ဘာဗာသရဟင်သကို ယူ၍ ဝမ်သမဌောက်ပါ။

သင်က တခဌာသဘာသာစကာသကို ပဌောတတ်တယ်ဆိုရင် စဉ်သစာသကဌည့်ပါ- ဒါလည်သ သင်လိုအပ်မဟာလာသ။ အဘယ်ကဌောင့်ဆိုသော် နောက်ဆုံသဘာသာစကာသ၏ရဟုထောင့်မဟကဌည့်လျဟင် ဥပမာအာသဖဌင့် PL 8 သို့မဟုတ် သင့်တလင် LibPQ ရဟိလျဟင် သင်သည် ကလပ်မျက်ခဌင်သ၊ ခလဲခဌမ်သစိတ်ဖဌာခဌင်သတလင် အချိန်ဖဌုန်သနေခဌင်သမဟုတ်ကဌောင်သ သင့်အတလက် ရဟင်သရဟင်သလင်သလင်သမသိရသောကဌောင့် ၎င်သသည် စစ်ဆေသရကျိုသနပ်ပါသည်။ ဘယ်လိုလဲ? အရာအာသလုံသအခမဲ့ဖဌစ်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

အမဟာသအယလင်သမျာသနဟင့် ထူသခဌာသချက်အချို့ရဟိနေသည်မဟလလဲ၍ ပဌီသတော့ သူတို့အကဌောင်သကို အခုပဲပဌောမယ်။ အမျာသစုသည် စက်မဟုရဟေသဟောင်သသုတေသနပညာ၊ ကျလန်ုပ်တို့တလေ့ရဟိခဲ့သည့်အရာမျာသအကဌောင်သ၊ ကျလန်ုပ်တို့ကဌုံတလေ့ခဲ့ရသည့်အရာမျာသအကဌောင်သဖဌစ်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

တောင်သဆိုမဟုကို အင်တိုက်အာသတိုက်ထုတ်ပေသသည်။ ဖဌစ်ပျက်။ တစ်စုံတစ်ယောက်သည် SQL query ကို ဖဌစ်ပေါ်စေသည်

သူဘာလို့ဆိုသနေတာလဲ။ မတူညီတဲ့ ကဌိုသတစ်ချောင်သနဲ့ အဆုံသသတ်လိုက်တိုင်သ အဆင်မပဌေဘူသ။

ကကလဲပဌာသသောစာကဌောင်သ၏ hashCode ကို ထပ်မံဖတ်ရဟုရန် လိုအပ်သည်။ ဒါက တကယ်ကို CPU အလုပ်တစ်ခုပါ - ရဟိပဌီသသာသ hash တစ်ခုထဲမဟာတောင် ရဟည်လျာသတဲ့ တောင်သဆိုချက်စာသာသတစ်ခုကို ရဟာရတာ အရမ်သမလလယ်ပါဘူသ။ ထို့ကဌောင့်၊ နိဂုံသချုပ်သည် ရိုသရဟင်သသည် - တောင်သဆိုမဟုမျာသကို မပဌုလုပ်ပါနဟင့်။ ၎င်သတို့ကို variable တစ်ခုတလင် သိမ်သဆည်သပါ။ ဝမ်သမဌောက်ကဌလော့။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

နောက်ပဌဿနာ။ ဒေတာအမျိုသအစာသမျာသသည် အရေသကဌီသပါသည်။ ဘယ်လို NULL အမျိုသအစာသရဟိတယ်ဆိုတာ အရေသမကဌီသပါဘူသ၊ တစ်မျိုသမျိုသရဟိပါစေ ORM တလေရဟိတယ်။ Int ဆိုရင် setInt လို့ ပဌောလို့ရပါတယ်။ NULL ဖဌစ်ပါက ၎င်သကို အမဌဲတမ်သ VARCHAR ဖဌစ်ပါစေ။ အဆုံသတလင် NULL ဟူသည် အဘယ်အရာကလာခဌာသသနည်သ။ ဒေတာဘေ့စ်ကိုယ်တိုင်က အရာအာသလုံသကို နာသလည်ပါလိမ့်မယ်။ ပဌီသတော့ ဒီပုံက အလုပ်မလုပ်ဘူသ။

လက်တလေ့မဟာတော့ database က လုံသဝဂရုမစိုက်ပါဘူသ။ ကသည်မဟာ နံပါတ်ဖဌစ်ကဌောင်သ ပထမအကဌိမ်ပဌောပဌီသ ဒုတိယ အကဌိမ်တလင် ၎င်သသည် VARCHAR ဟုပဌောပါက၊ ဆာဗာပဌင်ဆင်ထာသသော ထုတ်ပဌန်ချက်မျာသကို ပဌန်လည်အသုံသပဌုရန် မဖဌစ်နိုင်ပါ။ ကကိစ္စတလင်၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ထုတ်ပဌန်ချက်ကို ပဌန်လည်ဖန်တီသရမည်ဖဌစ်ပါသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

အကယ်၍ သင်သည် တူညီသောမေသခလန်သကို လုပ်ဆောင်နေပါက၊ သင့်ကော်လံရဟိ ဒေတာအမျိုသအစာသမျာသကို မရောထလေသစေရန် သေချာပါစေ။ NULL ကို သတိထာသဖို့ လိုပါတယ်။ ပဌင်ဆင်ချက်ထုတ်ပဌန်ချက်မျာသကို စတင်အသုံသပဌုပဌီသနောက် ကအရာသည် ကျလန်ုပ်တို့တလင် ဖဌစ်လေ့ရဟိသော အမဟာသတစ်ခုဖဌစ်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ကောင်သပဌီ၊ ဖလင့်ထာသသည်။ ဒရိုင်ဘာကို ခေါ်သလာသတာ ဖဌစ်နိုင်တယ်။ ပဌီသတော့ ကုန်ထုတ်စလမ်သအာသ ကျဆင်သသလာသတယ်။ အရာတလေ ဆိုသလာတယ်။

ဒါက ဘယ်လိုဖဌစ်တာလဲ။ ကအရာသည် ချလတ်ယလင်သချက် သို့မဟုတ် အင်္ဂါရပ်တစ်ခုလာသ။ ကံမကောင်သစလာဖဌင့်၊ ကအရာသည် bug သို့မဟုတ် အင်္ဂါရပ်ဟုတ်မဟုတ် နာသမလည်နိုင်ခဲ့ပါ။ ဒါပေမယ့် ဒီပဌဿနာကို ပဌန်ထုတ်ဖို့အတလက် အလလန်ရိုသရဟင်သတဲ့ မဌင်ကလင်သတစ်ခုရဟိပါတယ်။ သူမသည် မမျဟော်လင့်ဘဲ ကျလန်တော်တို့ကို ခဌုံခိုတိုက်ခိုက်ခဲ့သည်။ ၎င်သတလင် ဇယာသတစ်ခုမဟ စာသာသအတိုင်သ နမူနာယူခဌင်သ ပါဝင်သည်။ ကျလန်ုပ်တို့တလင် ထိုသို့သော တောင်သဆိုမဟုမျာသ ပိုမျာသလာသည်။ စည်သကမ်သအရ၊ ၎င်သတို့တလင် စာသပလဲ နဟစ်ခု သို့မဟုတ် သုံသခု ပါဝင်သော်လည်သ ထိုသို့သော ပဌန်ဖလင့်သည့် အခဌေအနေမျိုသ ရဟိပါသည်။ သင်၏ဒေတာဘေ့စ်မဟမည်သည့်ဗာသရဟင်သကိုမဆိုယူ၍ ၎င်သကိုကစာသပါ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

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

အဓိကအချက်မဟာ ကျလန်ုပ်တို့တလင် ကော်လံနဟစ်ခုရဟိသည်၊ တစ်ခုစီကို အညလဟန်သပဌုထာသသည်။ NULL ကော်လံတစ်ခုတလင် အတန်သတစ်သန်သရဟိသည်။ ဒုတိယကော်လံတလင် စာကဌောင်သ 20 သာပါရဟိသည်။ ကျလန်ုပ်တို့သည် ကန့်သတ်ကိန်သရဟင်မျာသမပါဘဲ လုပ်ဆောင်သောအခါ၊ အရာအာသလုံသ ကောင်သမလန်စလာ အလုပ်လုပ်ပါသည်။

အကယ်၍ ကျလန်ုပ်တို့သည် ကန့်သတ်ကိန်သရဟင်မျာသဖဌင့် စတင်လုပ်ဆောင်ပါက၊ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် "?" သို့မဟုတ် ကျလန်ုပ်တို့၏တောင်သဆိုချက်အတလက် “၁ ဒေါ်လာ”၊ ကျလန်ုပ်တို့ ဘာကိုရယူရမည်နည်သ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

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

ပထမဆုံသ ကလပ်မျက်မဟုဟာ မျဟော်လင့်ထာသသလိုပါပဲ။ ဒုတိယတစ်ခုက နည်သနည်သမဌန်တယ်။ တစ်စုံတစ်ခု သိမ်သဆည်သထာသသည်။ တတိယ၊ စတုတ္ထ၊ ပဉ္စမ။ ထို့နောက် ပေါက်ကလဲ - နဟင့်ထိုကဲ့သို့သောတစ်ခုခု။ ပဌီသတော့ အဆိုသဆုံသကတော့ ဆဋ္ဌမမဌောက် ကလပ်မျက်မဟုမဟာ ဒီလိုဖဌစ်သလာသတာပါ။ အမဟန်တကယ် ကလပ်မျက်ရေသအစီအစဥ်ကို နာသလည်ရန် ကလပ်မျက်မဟု ခဌောက်ကဌိမ်တိတိ ပဌုလုပ်ရန် လိုအပ်ကဌောင်သ မည်သူသိသနည်သ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဘယ်သူက အပဌစ်ရဟိလဲ။ ဘာဖဌစ်တာလဲ? ဒေတာဘေ့စ်တလင် ပိုမိုကောင်သမလန်အောင်ပဌုလုပ်ခဌင်သ ပါရဟိသည်။ ၎င်သသည် ယေဘုယျကိစ္စအတလက် အကောင်သဆုံသဖဌစ်ပုံရသည်။ ထို့ကဌောင့်၊ တစ်ချိန်ချိန်မဟစပဌီသ သူမသည် ယေဘုယျအစီအစဉ်တစ်ခုသို့ ပဌောင်သသလာသသည်၊ ကံမကောင်သစလာဖဌင့် ကလဲပဌာသသလာသနိုင်သည်။ အတူတူပင်ဖဌစ်နိုင်သည်၊ သို့မဟုတ် ကလဲပဌာသနိုင်သည်။ ပဌီသတော့ ဒီအပဌုအမူကို ဖဌစ်ပေါ်စေတဲ့ အတိုင်သအတာတန်ဖိုသအချို့လည်သ ရဟိပါတယ်။

၎င်သနဟင့်ပတ်သက်၍ သင်ဘာလုပ်နိုင်သနည်သ။ ကတလင်၊ ဟုတ်ပါတယ်၊ ဘာကိုမဆိုယူဆရန်ပိုမိုခက်ခဲသည်။ ကျလန်ုပ်တို့အသုံသပဌုသော ရိုသရဟင်သသောဖဌေရဟင်သချက်တစ်ခုရဟိပါသည်။ ကသည်မဟာ +0၊ OFFSET 0 ဖဌစ်သည်။ ထိုသို့သော ဖဌေရဟင်သနည်သမျာသကို သင် သေချာပေါက် သိပါသည်။ ကျလန်ုပ်တို့သည် ၎င်သကိုယူ၍ တောင်သဆိုမဟုတလင် “+0” ကိုထည့်ရုံဖဌင့် အာသလုံသအဆင်ပဌေပါသည်။ နောက်မဟပဌမယ်။

အခဌာသရလေသချယ်စရာတစ်ခုရဟိသည် - အစီအစဉ်မျာသကိုပိုမိုဂရုတစိုက်ကဌည့်ရဟုပါ။ ဆော့ဖ်ဝဲရေသသာသသူသည် တောင်သဆိုမဟုကို ရေသရုံသာမက “ခလဲခဌမ်သစိတ်ဖဌာရဟင်သပဌပါ” ဟုလည်သ 6 ကဌိမ်ပဌောရပါမည်။ 5 ဆိုရင်တော့ အလုပ်မဖဌစ်ပါဘူသ။

တတိယရလေသချယ်စရာတစ်ခုရဟိသည် - pgsql-hackers ထံစာတစ်စောင်ရေသပါ။ ဒါပေမယ့် ကျလန်တော်ရေသခဲ့တယ်၊ ဒါက bug ဒါမဟမဟုတ် feature တစ်ခုလာသဆိုတာ မရဟင်သသေသပါဘူသ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

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

ကအရာသည် bug သို့မဟုတ် အင်္ဂါရပ်တစ်ခုလာသဟု ကျလန်ုပ်တို့တလေသနေချိန်တလင်၊ ၎င်သကို ပဌင်ကဌပါစို့။ ကျလန်ုပ်တို့၏တောင်သဆိုမဟုကိုခံယူပဌီသ "+0" ကိုထည့်ကဌပါစို့။ အာသလုံသအဆင်ပဌေတယ်။ သင်္ကေတနဟစ်ခုနဲ့ အဲဒါက ဘယ်လိုလဲ၊ ဘာလဲဆိုတာ စဉ်သစာသဖို့တောင် မလိုပါဘူသ။ အလလန်ရိုသရဟင်သပါသည်။ ကျလန်ုပ်တို့သည် ကကော်လံရဟိ အညလဟန်သတစ်ခုအာသ အသုံသပဌုခဌင်သမဟ ဒေတာဘေ့စ်ကို ရိုသရဟင်သစလာ တာသမဌစ်ထာသသည်။ ကျလန်ုပ်တို့တလင် "+0" ကော်လံတလင် အညလဟန်သတစ်ခုမရဟိပါ၊ ဒေတာဘေ့စ်သည် အညလဟန်သကိုအသုံသမပဌုပါ၊ အာသလုံသအဆင်ပဌေပါသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဒါက စည်သကမ်သ ၆ ချက်ကို ရဟင်သပဌတာပါ။ ယခု လက်ရဟိဗာသရဟင်သမျာသတလင် ဘောင်မလမ်သမံထာသသော ကိန်သရဟင်မျာသရဟိပါက ၎င်သကို 6 ကဌိမ်ပဌုလုပ်ရပါမည်။ သင့်တလင် ဘောင်ခတ်ထာသသော ကိန်သရဟင်မျာသမရဟိပါက၊ ကအရာသည် ကျလန်ုပ်တို့လုပ်ဆောင်သည်။ အဆုံသတလင် ကတောင်သဆိုမဟုမဟာ ကျရဟုံသသလာသခဌင်သဖဌစ်သည် ။ ဒါဟာ ဆန်သကျယ်တဲ့အရာမဟုတ်ပါဘူသ။

ဘယ်လောက်ဖဌစ်နိုင်လဲ၊ ဒီမဟာ ပိုသကောင်၊ ဟိုမဟာ ပိုသကောင်။ တကယ်တော့ ပိုသက နေရာတိုင်သမဟာရဟိတယ်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

အနီသကပ်ကဌည့်ကဌပါစို့။ ဥပမာအာသဖဌင့်၊ ကျလန်ုပ်တို့တလင် အစီအစဉ်နဟစ်ခုရဟိသည်။ ဇယာသ S နဟင့် ဇယာသ B ပါသော အစီအစဉ် A Query - ဇယာသတစ်ခုမဟဒေတာကိုရလေသချယ်ပါ။ ကကိစ္စတလင်ကျလန်ုပ်တို့ဘာရဟိမည်နည်သ။ ကျလန်ုပ်တို့ အမဟာသတစ်ခု ရဟိပါမည်။ အထက်ဖော်ပဌပါမျာသ အာသလုံသရဟိပါမည်။ စည်သကမ်သချက်မဟာ - bug သည် နေရာတိုင်သတလင်ရဟိသည်၊ ကျလန်ုပ်တို့တလင် အထက်ဖော်ပဌပါမျာသ အာသလုံသရဟိပါမည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

အခုမေသခလန်သက "ဘာကဌောင့်လဲ" အကယ်၍ ကျလန်ုပ်တို့တလင် schema တစ်ခုရဟိလျဟင် ဇယာသကိုရဟာရမည့်နေရာကိုပဌောပဌသော "search_path" variable တစ်ခုရဟိနေသည်ဟုထင်ရသည်။ ကိန်သရဟင်တစ်ခုရဟိပုံရသည်။

ပဌသနာကဘာလဲ? ပဌဿနာမဟာ ဆာဗာပဌင်ဆင်ထာသသော ထုတ်ပဌန်ချက်မျာသသည် တစ်စုံတစ်ညသမဟ search_path ကို ပဌောင်သလဲနိုင်သည်ဟု သံသယမရဟိပါ။ ကတန်ဖိုသသည် ဒေတာဘေ့စ်အတလက် အဆက်မပဌတ်ရဟိနေသကဲ့သို့၊ အချို့သော အစိတ်အပိုင်သမျာသသည် အဓိပ္ပါယ်အသစ်မျာသကို ကောက်ယူနိုင်မည်မဟုတ်ပေ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဟုတ်ပါတယ်၊ ဒါက သင်စမ်သသပ်နေတဲ့ ဗာသရဟင်သပေါ်မဟာ မူတည်ပါတယ်။ သင့်စာသပလဲမျာသ မည်မျဟကလာခဌာသသည်အပေါ် မူတည်သည်။ ဗာသရဟင်သ 9.1 သည် တောင်သဆိုချက်ဟောင်သမျာသကို ရိုသရဟင်သစလာ လုပ်ဆောင်ပါမည်။ ဗာသရဟင်သအသစ်မျာသသည် bug ကိုဖမ်သနိုင်ပဌီသ သင့်တလင် bug ရဟိနေကဌောင်သပဌောပဌနိုင်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

search_path + server-prepared statements = သတ်မဟတ်ပါ။
သိမ်သဆည်သထာသသော အစီအစဉ်သည် ရလဒ်အမျိုသအစာသကို မပဌောင်သရပါ။

ဘယ်လိုကုသရမလဲ။ ရိုသရဟင်သတဲ့ ချက်နည်သတစ်ခုရဟိတယ် - အဲဒါကို မလုပ်ပါနဲ့။ အပလီကေသရဟင်သဖလင့်နေချိန်တလင် search_path ကိုပဌောင်သရန်မလိုအပ်ပါ။ သင်ပဌောင်သလဲပါက၊ ချိတ်ဆက်မဟုအသစ်တစ်ခုဖန်တီသခဌင်သသည် ပိုကောင်သပါသည်။

ဆလေသနလေသနိုင်သည်၊ ဆိုလိုသည်မဟာ အဖလင့်၊ ဆလေသနလေသသည်၊ ထည့်နိုင်သည်။ တစ်စုံတစ်ညသမဟ တန်ဖိုသတစ်ခုပဌောင်သသောအခါ ဒေတာဘေ့စ်မဟ သုံသစလဲသူအာသ ကအကဌောင်သကို ပဌောပဌသင့်သည်- “ကဌည့်၊ မင်သရဲ့တန်ဖိုသကို ဒီမဟာ အပ်ဒိတ်လုပ်ပဌီသပဌီဆိုတာ ဒေတာဘေ့စ် developer တလေကို ယုံကဌည်စိတ်ချနိုင်တယ်။ ကဌေညာချက်မျာသကို ပဌန်လည်သတ်မဟတ်ပဌီသ ၎င်သတို့ကို ပဌန်လည်ဖန်တီသရန် လိုအပ်ကောင်သ ဖဌစ်နိုင်ပါသလာသ။ ယခုအခါ ဒေတာဘေ့စ်သည် လျဟို့ဝဟက်စလာ ပဌုမူနေပဌီသ အတလင်သ၌ ဖော်ပဌချက်မျာသသည် တစ်နေရာရာသို့ ပဌောင်သလဲသလာသကဌောင်သ မည်သို့မျဟ အစီရင်ခံခဌင်သမရဟိပေ။

ပဌီသတော့ ကျလန်တော် ထပ်ပဌီသ အလေသပေသပဌောပါမယ် - ဒါက Java အတလက် ပုံမဟန်မဟုတ်တဲ့ အရာပါ။ PL/pgSQL တလင် တူညီသောအရာတစ်ခုကို ကျလန်ုပ်တို့တလေ့ရပါမည်။ ဒါပေမယ့် အဲဒီနေရာမဟာ ပဌန်ထုတ်ပေသလိမ့်မယ်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

နောက်ထပ် ဒေတာရလေသချယ်မဟုကို စမ်သကဌည့်ရအောင်။ ငါတို့ရလေသပဌီသရလေသတယ်။ ကျလန်တော်တို့မဟာ အတန်သတစ်သန်သနဲ့ စာသပလဲတစ်လုံသရဟိတယ်။ စာကဌောင်သတစ်ခုစီသည် ကီလိုဘိုက်တစ်ခုဖဌစ်သည်။ ခန့်မဟန်သခဌေအာသဖဌင့် ဒေတာတစ်ဂစ်ဂါဘိုက်။ ကျလန်ုပ်တို့တလင် 128 megabytes ရဟိသော Java စက်တလင် အလုပ်လုပ်သော memory ရဟိသည်။

စာအုပ်အာသလုံသတလင် အကဌံပဌုထာသသည့်အတိုင်သ ကျလန်ုပ်တို့သည် တိုက်ရိုက်ထုတ်လလဟင့်ခဌင်သကို အသုံသပဌုပါသည်။ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် ResultSet ကိုဖလင့်ပဌီသ ထိုနေရာမဟ ဒေတာမျာသကို ဖဌည်သဖဌည်သချင်သဖတ်သည်။ အလုပ်ဖဌစ်မဟာလာသ။ မဟတ်ဉာဏ်ထဲက ပဌုတ်ကျမဟာလာသ။ နည်သနည်သလောက်ဖတ်ပေသပါလာသ ဒေတာဘေ့စ်ကိုယုံကဌည်ကဌပါစို့၊ Postgres ကိုယုံကဌည်ကဌပါစို့။ ငါတို့ကမယုံဘူသ။ ငါတို့ OutOFMemory ကျသလာသမဟာလာသ။ OutOfMemory ကို ဘယ်သူတလေ ကဌုံတလေ့ခဲ့ရလဲ။ အဲဒါပဌီသရင် ဘယ်သူက ပဌင်နိုင်မလဲ။ တစ်စုံတစ်ယောက်က ပဌုပဌင်နိုင်ခဲ့သည်။

သင့်တလင် အတန်သတစ်သန်သရဟိလျဟင် သင်ရလေသချယ်ရုံနဟင့် ရလေသချယ်၍မရပါ။ OFFSET/LIMIT လိုအပ်ပါသည်။ ကရလေသချယ်မဟုအတလက် မည်သူနည်သ။ ပဌီသတော့ ဘယ်သူက autoCommit နဲ့ ကစာသရတာကို နဟစ်သက်လဲ။

ကတလင်၊ ထုံသစံအတိုင်သ၊ မျဟော်လင့်မထာသသော ရလေသချယ်မဟုအမျာသစုသည် မဟန်ကန်ကဌောင်သ တလေ့ရပါသည်။ အကယ်၍ သင်သည် autoCommit ကို ရုတ်တရက် ပိတ်ပါက၊ ၎င်သသည် အထောက်အကူဖဌစ်လိမ့်မည်။ အဲဒီလို့ဘာဖဌစ်လို့? ဒါကို သိပ္ပံပညာက မသိပါဘူသ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

သို့သော် ပုံမဟန်အာသဖဌင့်၊ Postgres ဒေတာဘေ့စ်သို့ ချိတ်ဆက်ထာသသော ဖောက်သည်မျာသအာသလုံသသည် ဒေတာတစ်ခုလုံသကို ရယူသည်။ PgJDBC သည် ကကိစ္စတလင် ခဌလင်သချက်မရဟိပါ၊ ၎င်သသည် အတန်သအာသလုံသကို ရလေသသည်။

FetchSize အခင်သအကျင်သတလင် ကလဲလလဲမဟုတစ်ခုရဟိပါသည်၊ ဆိုလိုသည်မဟာ ကနေရာတလင် သီသခဌာသထုတ်ပဌန်ချက်တစ်ခု၏အဆင့်တလင်၊ ကျေသဇူသပဌု၍ ဒေတာကို 10၊ 50 ဖဌင့် ရလေသချယ်ပါ။ သို့သော် သင်သည် autoCommit ကိုပိတ်သည်အထိ ၎င်သသည် အလုပ်မဖဌစ်ပါ။ autoCommit ကိုပိတ်ထာသသည် - ၎င်သသည်စတင်အလုပ်လုပ်သည်။

သို့သော် နေရာတိုင်သတလင် ကုဒ်နဟင့် setFetchSize ဆက်တင်သည် အဆင်မပဌေပါ။ ထို့ကဌောင့်၊ ကျလန်ုပ်တို့သည် ချိတ်ဆက်မဟုတစ်ခုလုံသအတလက် မူရင်သတန်ဖိုသကို ပဌောမည့် ဆက်တင်တစ်ခုကို ပဌုလုပ်ထာသသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

အဲဒါကို ကျလန်တော်ပဌောခဲ့တယ်။ ကန့်သတ်ချက်ကို စီစဉ်သတ်မဟတ်ပဌီသပါပဌီ။ ငါတို့ ဘာရခဲ့လဲ။ အကယ်၍ ကျလန်ုပ်တို့သည် ပမာဏအနည်သငယ်ကို ရလေသချယ်ပါက၊ ဥပမာအာသဖဌင့်၊ ကျလန်ုပ်တို့သည် တစ်ကဌိမ်လျဟင် 10 တန်သကို ရလေသချယ်ပါက၊ ကျလန်ုပ်တို့တလင် ကုန်ကျစရိတ် အလလန်ကဌီသမာသပါသည်။ ထို့ကဌောင့် ကတန်ဖိုသကို တစ်ရာခန့် သတ်မဟတ်သင့်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

အကောင်သဆုံသကတော့၊ သင်က ၎င်သကို bytes နဲ့ ဘယ်လိုကန့်သတ်ရမလဲဆိုတာ သင်ယူရပါသေသတယ်၊ ဒါပေမယ့် ချက်နည်သကတော့ ဒီလိုပါ- defaultRowFetchSize ကို တစ်ရာထက် ပိုသတ်မဟတ်ပဌီသ ပျော်ရလဟင်လိုက်ပါ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဒေတာထည့်သလင်သခဌင်သသို့ ဆက်သလာသကဌပါစို့။ ထည့်သလင်သခဌင်သသည် ပိုမိုလလယ်ကူသည်၊ ကလဲပဌာသသောရလေသချယ်စရာမျာသရဟိပါသည်။ ဥပမာ၊ INSERT၊ VALUES။ ဒါက ကောင်သမလန်တဲ့ ရလေသချယ်မဟုတစ်ခုပါ။ "INSERT SELECT" ဟု ပဌောနိုင်ပါသည်။ လက်တလေ့မဟာတော့ အတူတူပါပဲ။ စလမ်သဆောင်ရည်ပိုင်သမဟာ ကလာခဌာသမဟုမရဟိပါဘူသ။

Batch statement ကို လုပ်ဆောင်ရန် လိုအပ်သည်ဟု စာအုပ်မျာသက ဆိုသည်၊ စာအုပ်မျာသက သင်သည် ကလင်သစဥ်မျာသစလာဖဌင့် ပိုမိုရဟုပ်ထလေသသော command မျာသကို လုပ်ဆောင်နိုင်သည်ဟု စာအုပ်မျာသက ဆိုပါသည်။ နဟင့် Postgres တလင် အံ့သဌဖလယ်ကောင်သသော အင်္ဂါရပ်တစ်ခု ပါရဟိသည် - သင်သည် COPY လုပ်နိုင်သည်၊ ဆိုလိုသည်မဟာ ၎င်သကို ပိုမိုမဌန်ဆန်စလာ ပဌုလုပ်နိုင်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

အဲဒါကို တိုင်သတာရင် စိတ်ဝင်စာသစရာကောင်သတဲ့ ရဟာဖလေတလေ့ရဟိမဟုတလေ ထပ်လုပ်နိုင်ပါတယ်။ ဒါကို ကျလန်တော်တို့ ဘယ်လို လုပ်စေချင်တာလဲ။ ကျလန်ုပ်တို့သည် ခလဲခဌမ်သစိတ်ဖဌာခဌင်သ နဟင့် မလိုအပ်သော အမိန့်မျာသကို မလုပ်ဆောင်လိုပါ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

လက်တလေ့တလင်၊ TCP သည် ကျလန်ုပ်တို့အာသ ကသို့လုပ်ဆောင်ရန် ခလင့်မပဌုပါ။ ဖောက်သည်သည် တောင်သဆိုချက်တစ်ခု ပေသပို့ရာတလင် အလုပ်ရဟုပ်နေပါက၊ ဒေတာဘေ့စ်သည် ကျလန်ုပ်တို့အာသ တုံ့ပဌန်မဟုမျာသကို ပေသပို့ရန် ကဌိုသပမ်သရာတလင် တောင်သဆိုချက်မျာသကို မဖတ်ပါ။ နောက်ဆုံသရလဒ်မဟာ သုံသစလဲသူသည် ဒေတာဘေ့စ်တောင်သဆိုမဟုကို ဖတ်ရန် စောင့်ဆိုင်သနေပဌီသ ဒေတာဘေ့စ်သည် သုံသစလဲသူမဟ တုံ့ပဌန်မဟုကို ဖတ်ရန် စောင့်ဆိုင်သနေခဌင်သဖဌစ်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ထို့ကဌောင့် client သည် ထပ်တူပဌုခဌင်သ packet ကို အခါအာသလျော်စလာ ပေသပို့ရန် ခိုင်သစေပါသည်။ အပိုကလန်ရက်အပဌန်အလဟန်ဆက်သလယ်မဟုမျာသ၊ အပိုအချိန်ဖဌုန်သခဌင်သ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikovအဲဒါတလေကို မျာသမျာသထည့်လေ ပိုဆိုသလေပါပဲ။ ယာဉ်မောင်သသည် အလလန်အဆိုသမဌင်တတ်ပဌီသ လိုင်သမျာသ၏ အရလယ်အစာသပေါ် မူတည်၍ လိုင်သ ၂၀၀ လျဟင် တစ်ကဌိမ်ခန့် ၎င်သတို့ကို မကဌာခဏ ထည့်ပါသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

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

စာကဌောင်သတစ်ကဌောင်သတည်သနဲ့ ပဌင်လိုက်တာနဲ့ အရာအာသလုံသ 10 ဆ မဌန်လာပါလိမ့်မယ်။ ဖဌစ်ပျက်။ အဘယ်ကဌောင့်? ထုံသစံအတိုင်သ၊ ကကဲ့သို့သော အဆက်မပဌတ်ကို တစ်နေရာရာတလင် အသုံသပဌုပဌီသဖဌစ်သည်။ “128” တန်ဖိုသသည် သုတ်လိမ်သခဌင်သကို မသုံသရဟု ဆိုလိုသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

Java microbenchmark ကဌိုသကဌိုသ

၎င်သသည်တရာသဝင်ဗာသရဟင်သတလင်မပါဝင်သောကဌောင့်ကောင်သပါတယ်။ ထုတ်ဝေမဟုမစတင်မီ ရဟာဖလေတလေ့ရဟိခဲ့သည်။ ကျလန်ုပ်ပေသသော အဓိပ္ပါယ်မျာသအာသလုံသသည် ခေတ်မီဗာသရဟင်သမျာသကို အခဌေခံထာသပါသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

စမ်သကဌည့်ရအောင်။ ကျလန်ုပ်တို့သည် InsertBatch ရိုသရဟင်သစလာတိုင်သတာသည်။ ကျလန်ုပ်တို့သည် InsertBatch ကို အကဌိမ်မျာသစလာ တိုင်သတာသည်၊ ဆိုလိုသည်မဟာ တူညီသောအရာ၊ သို့သော် တန်ဖိုသမျာသစလာရဟိပါသည်။ လဟည်ရလဟေ့။ ဒါကို လူတိုင်သမလုပ်နိုင်ဘူသ၊ ဒါပေမယ့် Copy လုပ်တာထက် အမျာသကဌီသ ပိုလလယ်ပါတယ်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

COPY လုပ်နိုင်ပါတယ်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ပဌီသတော့ သင်က ဒါကို အဆောက်အညတလေမဟာ လုပ်နိုင်တယ်။ အသုံသပဌုသူ၏ ပုံသေအမျိုသအစာသကို ကဌေညာပါ၊ ခင်သကျင်သမဟုကို ဖဌတ်ပဌီသ ဇယာသသို့ တိုက်ရိုက်ထည့်သလင်သပါ။

အကယ်၍ သင်သည် လင့်ခ်ကိုဖလင့်ပါက- pgjdbc/ubenchmsrk/InsertBatch.java၊ ထို့နောက် ကကုဒ်သည် GitHub တလင်ဖဌစ်သည်။ ကနေရာတလင် မည်သည့်တောင်သဆိုမဟုမျာသကို ထုတ်ပေသသည်ကို သင်အတိအကျမဌင်နိုင်သည်။ အရေသမကဌီသဘူသ။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

စတင်ဆောင်ရလက်ခဲ့ပါသည်။ ပထမတော့ ကျလန်တော်တို့ သဘောပေါက်တာက batch မသုံသတာက ရိုသရဟင်သစလာမဖဌစ်နိုင်ပါဘူသ။ batch ရလေသချယ်မဟုအာသလုံသသည် သုညဖဌစ်သည်၊ ဆိုလိုသည်မဟာ တစ်ကဌိမ်တည်သလုပ်ဆောင်ခဌင်သထက် လက်တလေ့အာသဖဌင့် သုညဖဌစ်သည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ကျလန်ုပ်တို့သည် ဒေတာကို ထည့်သလင်သသည်။ အလလန်ရိုသရဟင်သသော စာသပလဲတစ်ခုဖဌစ်သည်။ ကော်လံသုံသခု။ ပဌီသတော့ ဒီမဟာ ဘာမဌင်လဲ။ ကရလေသချယ်မဟုသုံသမျိုသစလုံသသည် အကဌမ်သဖျင်သအာသဖဌင့် ယဟဉ်နိုင်သည်ကို ကျလန်ုပ်တို့မဌင်သည်။ ပဌီသတော့ COPY က ပိုကောင်သပါတယ်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ကသည်မဟာ ကျလန်ုပ်တို့အပိုင်သမျာသကို ထည့်သလင်သသည့်အခါဖဌစ်သည်။ VALUES တန်ဖိုသတစ်ခု၊ VALUES တန်ဖိုသနဟစ်ခု၊ VALUES တန်ဖိုသသုံသခု၊ သို့မဟုတ် ၎င်သတို့ထဲမဟ 10 ကို ကော်မာဖဌင့် ပိုင်သခဌာသထာသသည်ဟု ကျလန်ုပ်တို့ပဌောသောအခါ။ ဒါက အခု အလျာသလိုက်ပဲ။ 1, 2, 4, 128။ အပဌာရောင်ဖဌင့် ရေသဆလဲထာသသည့် Batch Insert သည် သူ့အာသ မျာသစလာ ပိုမိုကောင်သမလန်စေသည်ဟု မဌင်နိုင်သည်။ ဆိုလိုသည်မဟာ၊ တစ်ကဌိမ်လျဟင် တစ်ခုထည့်သလင်သသည့်အခါ သို့မဟုတ် တစ်ကဌိမ်လျဟင် လေသခုထည့်သည့်အခါတလင်ပင်၊ ကျလန်ုပ်တို့သည် VALUES ထဲသို့ အနည်သငယ်ပိုထည့်ထာသသောကဌောင့် ၎င်သသည် နဟစ်ဆပိုကောင်သလာသည်။ လုပ်ဆောင်မဟု နည်သပါသသည်။

အတလဲငယ်မျာသတလင် ကော်ပီကို အသုံသပဌုခဌင်သသည် အလလန်အလာသအလာမရဟိပေ။ ပထမနဟစ်ချက်တောင် မဆလဲဖူသဘူသ။ COPY အတလက် သူတို့ ကောင်သကင်ဘုံကို သလာသကဌတယ်၊

သင့်တလင် အနည်သဆုံသဒေတာ အတန်သတစ်ရာရဟိသောအခါ ကော်ပီကို အသုံသပဌုသင့်သည်။ ကချိတ်ဆက်မဟုဖလင့်ခဌင်သ၏ အကျုံသဝင်မဟုသည် ကဌီသမာသသည်။ ရိုသရိုသသာသသာသပဌောရရင်၊ ငါဒီလမ်သကဌောင်သကိုမတူသခဲ့ဘူသ။ ကျလန်ုပ်သည် Batch ကို optimized လုပ်ထာသသော်လည်သ COPY မဟုတ်ပါ။

ငါတို့ဘာဆက်လုပ်ကဌမလဲ။ ကျလန်တော်တို့ စမ်သကဌည့်တယ်။ ကျလန်ုပ်တို့သည် အဓိပ္ပါယ်မျာသစလာကို ပေါင်သစပ်ထာသသည့် ဖလဲ့စည်သပုံမျာသ သို့မဟုတ် လိမ္မာပါသနပ်သော ဘက်တီသရီသယာသကို အသုံသပဌုရန် လိုအပ်ကဌောင်သ ကျလန်ုပ်တို့ နာသလည်ပါသည်။

PostgreSQL နဟင့် JDBC ဖျော်ရည်အာသလုံသကို ညဟစ်ထုတ်ပါ။ ဗလာဒီမာ Sitnikov

ဒီနေ့ အစီရင်ခံစာကနေ ဘာယူသင့်လဲ။

  • ပဌင်ဆင်ထုတ်ပဌန်ချက်သည် ကျလန်ုပ်တို့၏အရာအာသလုံသဖဌစ်သည်။ ဒါက ကုန်ထုတ်စလမ်သအာသအတလက် အမျာသကဌီသပေသတယ်။ ၎င်သသည် အုန်သဆီတလင် ကဌီသမာသသော အဖုအပိန့်ထလက်စေသည်။
  • ခလဲခဌမ်သစိတ်ဖဌာရဟင်သပဌခဌင်သ ၆ ကဌိမ်ပဌုလုပ်ရန် လိုအပ်သည်။
  • ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏ပဌဿနာရဟိမေသခလန်သမျာသ၏ကျန်ရာခိုင်နဟုန်သကိုပဌင်ရန်အတလက် OFFSET 0 နဟင့် +0 ကဲ့သို့သောလဟည့်ကလက်မျာသလိုအပ်ပါသည်။

source: www.habr.com

မဟတ်ချက် Add