စက်ရပ်ချိန်နဟင့် ဒေတာဘေ့စ်မျာသကို သုည

စက်ရပ်ချိန်နဟင့် ဒေတာဘေ့စ်မျာသကို သုည

ကဆောင်သပါသတလင် အသုံသချမဟုတလင် ဒေတာဘေ့စ် လိုက်ဖက်ညီမဟုဆိုင်ရာ ပဌဿနာမျာသကို မည်သို့ဖဌေရဟင်သရမည်ကို အသေသစိတ် ရဟင်သပဌထာသသည်။ အကယ်၍ သင်သည် ပဏာမပဌင်ဆင်မဟုမရဟိဘဲ ဖဌန့်ကျက်ရန်ကဌိုသစာသပါက သင်၏ထုတ်လုပ်ရေသအက်ပလီကေသရဟင်သမျာသတလင် ဘာဖဌစ်နိုင်သည်ကို ကျလန်ုပ်တို့ပဌောပဌပါမည်။ ထို့နောက် ကျလန်ုပ်တို့သည် လုံသဝစက်ရပ်ရန် လိုအပ်သော လျဟောက်လလဟာဘဝစက်ဝန်သအဆင့်မျာသကို ဖဌတ်သန်သသလာသပါမည်။အနီသစပ်ဆုံသ လမ်သကဌော- နောက်ထပ် - သုည စက်ရပ်ချိန်) ကျလန်ုပ်တို့၏လုပ်ဆောင်မဟုမျာသ၏ရလဒ်သည် နောက်ပဌန်-သဟဇာတမဖဌစ်သောဒေတာဘေ့စ်ပဌောင်သလဲမဟုကို နောက်ပဌန်-သဟဇာတဖဌစ်စေသောပုံစံဖဌင့် အသုံသပဌုရန်ဖဌစ်သည်။

ဆောင်သပါသမဟ ကုဒ်နမူနာမျာသကို နာသလည်လိုပါက ၎င်သတို့ကို တလင် ရဟာဖလေနိုင်ပါသည်။ GitHub.

နိဒါန်သ

စက်ရပ်ချိန် လုံသဝမရဟိခဌင်သ။

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

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

  • သင့်ဝန်ဆောင်မဟု၏ ဗာသရဟင်သနံပါတ် 1 ကို အသုံသပဌုပါ။
  • ဒေတာဘေ့စ် ရလဟေ့ပဌောင်သခဌင်သကို လုပ်ဆောင်ပါ။
  • သင့်ဝန်ဆောင်မဟု၏ ဗာသရဟင်သ #2 ကို ဗာသရဟင်သ #1 ​​နဟင့် အပဌိုင် အသုံသပဌုပါ။
  • နံပါတ် 2 ဗာသရဟင်သကို သင်တလေ့မဌင်ပဌီသသည်နဟင့် ၎င်သသည် သင့်အနေဖဌင့် ဗာသရဟင်သနံပါတ် 1 ကို ဖယ်ရဟာသလိုက်ပါ။
  • အဆင်သင့်!

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

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

  • သင့်ထုတ်လုပ်ရေသကုဒ်မိတ္တူ (“အပဌာ” နဟင့် “အစိမ်သရောင်”) အလုပ်လုပ်ကဌောင်သ သေချာပါစေ။
  • အပဌာရောင်ပတ်ဝန်သကျင်သို့ အသလာသအလာအာသလုံသကို ညလဟန်ပဌပေသသည်၊ i.e. ထုတ်လုပ်မဟု URL မျာသသည် ထိုနေရာတလင် ညလဟန်ပဌရန်၊
  • စိမ်သလန်သသောပတ်ဝန်သကျင်တလင် အပလီကေသရဟင်သပဌောင်သလဲမဟုအာသလုံသကို အသုံသချပဌီသ စမ်သသပ်ပါ။
  • url မျာသကို အပဌာမဟ အစိမ်သရောင်ပတ်ဝန်သကျင်သို့ ပဌောင်သပါ။

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

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

တူညီသောပတ်ဝန်သကျင်၏ မိတ္တူနဟစ်စောင်ကို ထိန်သသိမ်သထာသရန် ၎င်သတို့အာသ ထိန်သသိမ်သရန် အာသထုတ်မဟု နဟစ်ဆလိုအပ်သောကဌောင့် ၎င်သတို့တလင် တူညီမဟုမျာသစလာရဟိသည်။ အဲဒါကဌောင့် တချို့အသင်သတလေက တောင်သဆိုတယ်။ Martin Fowlerကနည်သလမ်သ၏ ကလဲပဌာသမဟုကို လိုက်နာပါ-

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

ကတလင် ကဆောင်သပါသတလင် အဓိကပဌဿနာကို ကျလန်ုပ်တို့ ရောက်ရဟိလာပါသည်။ ဒေတာဘေ့စ. ဒီစကာသစုကို နောက်တစ်မျိုသ လေ့လာကဌည့်ရအောင်။

ဒေတာဘေ့စ် ရလဟေ့ပဌောင်သခဌင်သကို လုပ်ဆောင်ပါ။

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

ထို့ကဌောင့်၊ လုံသဝစက်ရပ်ခဌင်သ/အပဌာရောင်အစိမ်သရောင်ဖဌန့်ကျက်ခဌင်သ၏ ကဌီသမာသသောအကျိုသကျေသဇူသမျာသရဟိနေသော်လည်သ၊ ကုမ္ပဏီမျာသသည် ၎င်သတို့၏အက်ပ်လီကေသရဟင်သမျာသကိုအသုံသပဌုရန်အတလက်အောက်ပါပိုမိုဘေသကင်သသောလုပ်ငန်သစဉ်မျာသကိုလိုက်နာကဌပါသည်။

  • အပလီကေသရဟင်သဗာသရဟင်သအသစ်ဖဌင့် ပက်ကေ့ခ်ျတစ်ခုကို ပဌင်ဆင်ပါ။
  • လည်ပတ်နေသော application ကိုပိတ်ပါ။
  • ဒေတာဘေ့စ်ကိုပဌောင်သရလဟေ့ရန် scripts မျာသကို run ပါ။
  • အသုံသချပဌီသ အပလီကေသရဟင်သ၏ ဗာသရဟင်သအသစ်ကို စတင်ပါ။

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

ဒေတာဘေ့စပဌဿနာမျာသ

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

ဗာသရဟင်သရေသဆလဲခဌင်သအစီအစဉ်

ကဆောင်သပါသတလင်ကျလန်ုပ်တို့အသုံသပဌုပါမည်။ ပျံလမ်သ ဗာသရဟင်သထိန်သချုပ်ကိရိယာအဖဌစ် (အနီသစပ်ဆုံသ ဘာသာပဌန်ဆိုချက်- ကျလန်ုပ်တို့သည် ဒေတာဘေ့စ် ပဌောင်သရလဟေ့မဟုမျာသအကဌောင်သ ပဌောနေပါသည်။) ပုံမဟန်အာသဖဌင့်၊ ကျလန်ုပ်တို့သည် Built-in Flyway ပံ့ပိုသမဟုပါရဟိသော Spring Boot အပလီကေသရဟင်သကိုလည်သ ရေသသာသမည်ဖဌစ်ပဌီသ အက်ပ်လီကေသရဟင်သအကဌောင်သအရာကို သတ်မဟတ်နေစဉ်တလင် schema ရလဟေ့ပဌောင်သခဌင်သကို လုပ်ဆောင်မည်ဖဌစ်သည်။ Flyway ကိုအသုံသပဌုသောအခါ၊ သင်သည် သင်၏ပရောဂျက်ဖိုင်တလဲတလင် ရလဟေ့ပဌောင်သခဌင်သစခရစ်မျာသကို သိမ်သဆည်သထာသနိုင်သည် (ပုံမဟန်အာသဖဌင့် classpath:db/migration) ကနေရာတလင် ထိုကဲ့သို့သော ရလဟေ့ပဌောင်သခဌင်သဖိုင်မျာသ၏ ဥပမာကို သင်တလေ့နိုင်ပါသည်။

└── db
 └── migration
     ├── V1__init.sql
     ├── V2__Add_surname.sql
     ├── V3__Final_migration.sql
     └── V4__Remove_lastname.sql

ကနမူနာတလင် ယခင်က မလုပ်ဆောင်ပါက၊ အပလီကေသရဟင်သစတင်သောအခါ တစ်ခုပဌီသတစ်ခုလုပ်ဆောင်မည့် migration scripts 4 ခုကို ကျလန်ုပ်တို့တလေ့မဌင်ရသည်။ ဖိုင်တလေထဲက တစ်ခုကို ကဌည့်ရအောင် (V1__init.sql) ဥပမာတစ်ခုအနေနဲ့။

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

အရာအာသလုံသသည် ပဌီသပဌည့်စုံသော ကိုယ်တိုင်ရဟင်သပဌခဌင်သဖဌစ်သည်- သင့်ဒေတာဘေ့စ်ကို မည်သို့ပဌုပဌင်သင့်သည်ကို သတ်မဟတ်ရန် SQL ကို အသုံသပဌုနိုင်သည်။ Spring Boot နဟင့် Flyway အကဌောင်သပိုမိုသိရဟိလိုပါက၊ ဝင်ရောက်ကဌည့်ရဟုပါ။ Spring Boot Docs.

Spring Boot ဖဌင့် ရင်သမဌစ်ထိန်သချုပ်ကိရိယာကို အသုံသပဌုခဌင်သဖဌင့် သင်သည် အကျိုသကျေသဇူသကဌီသ 2 ခုကို ရရဟိသည်-

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

ဒေတာဘေ့စ်ပဌဿနာမျာသကိုဖဌေရဟင်သခဌင်သ။

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

  • နောက်ပဌန်မလိုက်နိုင်မဟု
  • နောက်ပဌန်လိုက်ဖက်မဟု

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

ကျလန်ုပ်တို့လုပ်ဆောင်မည့် ပရောဂျက်သည် ရိုသရဟင်သသော Spring Boot Flyway အက်ပလီကေသရဟင်သတစ်ခုဖဌစ်သည်။ Person с first_name О last_name ဒေတာဘေ့စ်ထဲမဟာ (အနီသစပ်ဆုံသ ဘာသာပဌန်- Person စာသပလဲနဟင့် f ဖဌစ်၏။irst_name О last_name - ဒါတလေက လယ်ကလင်သတလေပါ။) အမည်ပဌောင်သချင်ပါသည်။ last_name в surname.

ယူဆချက်

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

မဟတ်စု။ စီသပလာသရေသဆိုင်ရာ အကဌံပဌုချက်။ ရိုသရဟင်သသော လုပ်ငန်သစဉ်မျာသသည် သင့်အာသ ပံ့ပိုသကူညီမဟုတလင် ငလေမျာသစလာ သက်သာစေနိုင်သည် (သင့်ကုမ္ပဏီအတလက် အလုပ်လုပ်ပေသသူ မျာသပဌာသလေ၊ သင်ငလေ မျာသမျာသ စုဆောင်သနိုင်လေ)။

ဒေတာဘေ့စ်ကိုပဌန်လဟန်ရန်မလိုအပ်ပါ။

၎င်သသည် အသုံသချခဌင်သလုပ်ငန်သစဉ်ကို ရိုသရဟင်သစေသည် (အချို့သောဒေတာဘေ့စ်နောက်ပဌန်ဆုတ်ခဌင်သမျာသသည် မဖဌစ်နိုင်သလောက်နီသပါသဖဌစ်သည်၊ ဖျက်ခဌင်သ လဟန်ခဌင်သကဲ့သို့)။ ကျလန်ုပ်တို့သည် အပလီကေသရဟင်သမျာသကိုသာ ပဌန်ဖလင့်လိုပါသည်။ ကနည်သအာသဖဌင့် သင့်တလင် မတူညီသော ဒေတာဘေ့စ်မျာသ (ဥပမာ၊ SQL နဟင့် NoSQL) ရဟိလျဟင်ပင် သင်၏ ဖဌန့်ကျက်မဟုပိုက်လိုင်သသည် တူညီနေမည်ဖဌစ်သည်။

အပလီကေသရဟင်သကို ဗာသရဟင်သတစ်ခုသို့ ပဌန်လဟည့်ရန် အမဌဲတမ်သ ဖဌစ်နိုင်ရမည် (နောက်တဖန် မရဟိပါ)

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

မဟတ်ချက်. ပိုမိုဖတ်ရဟုနိုင်စေရန်အတလက်၊ ကဆောင်သပါသတလင် အပလီကေသရဟင်သ၏ အဓိကဗာသရဟင်သကို ပဌောင်သလဲပါမည်။

အဆင့် 1- ကနညသအခဌေအနေ

App ဗာသရဟင်သ: 1.0.0
DB ဗာသရဟင်သ- v1

မဟတ်ချက်

၎င်သသည် လျဟောက်လလဟာ၏ ကနညသအခဌေအနေဖဌစ်လိမ့်မည်။

ဒေတာဘေ့စ်ပဌောင်သလဲမဟုမျာသ

DB ပါရဟိသည်။ last_name.

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

ကုဒ်အပဌောင်သအလဲမျာသ

အပလီကေသရဟင်သသည် ပုဂ္ဂိုလ်ဆိုင်ရာ အချက်အလက်မျာသကို သိမ်သဆည်သထာသသည်။ last_name:

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return this.lastName;
    }

    public void setLastName(String lastname) {
        this.lastName = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName
                + "]";
    }
}

နောက်သို့တလဲ၍မရသောကော်လံအမည်ပဌောင်သခဌင်သ။

ကော်လံအမည်ကို ပဌောင်သလဲပုံ နမူနာကို ကဌည့်ကဌပါစို့။

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

App ဗာသရဟင်သ: 2.0.0.BAD

DB ဗာသရဟင်သ- v2bad

မဟတ်ချက်

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

A/B စမ်သသပ်ခဌင်သ။

လက်ရဟိအခဌေအနေမဟာ ကျလန်ုပ်တို့တလင် အက်ပလီကေသရဟင်သဗာသရဟင်သတစ်ခုရဟိသည်။ 1.0.0, ထုတ်လုပ်မဟုနဟင့် ဒေတာဘေ့စ်တလင် ဖဌန့်ကျက်ထာသသည်။ v1. ကျလန်ုပ်တို့သည် အပလီကေသရဟင်သ၏ ဒုတိယဥပမာ၊ ဗာသရဟင်သကို အသုံသပဌုရန် လိုအပ်သည်။ 2.0.0.BADနဟင့် ဒေတာဘေ့စ်ကို အပ်ဒိတ်လုပ်ပါ။ v2bad.

အဆင့်မျာသ

  1. ဗာသရဟင်သအပလီကေသရဟင်သ၏ဥပမာအသစ်တစ်ခုကို အသုံသပဌုထာသသည်။ 2.0.0.BADဒေတာဘေ့စ်ကို အပ်ဒိတ်လုပ်သည်။ v2bad
  2. အဆိုပါဒေတာဘေ့စ၌တည်၏ v2bad ကော်လံ last_name မရဟိတော့ဘူသ - အဲဒါကို ပဌောင်သလိုက်တယ်။ surname
  3. ဒေတာဘေ့စ်နဟင့် အပလီကေသရဟင်သ အပ်ဒိတ်သည် အောင်မဌင်ခဲ့ပဌီသ အချို့သော သာဓကမျာသကို လုပ်ဆောင်နေပါသည်။ 1.0.0, အခဌာသသူမျာသ - အတလက် 2.0.0.BAD. အရာအာသလုံသသည် database နဟင့်ချိတ်ဆက်ထာသသည်။ v2bad
  4. ဗာသရဟင်သအာသလုံသ၏ဥပမာ 1.0.0 ကော်လံထဲသို့ ဒေတာထည့်သလင်သရန် ကဌိုသစာသမည်ဖဌစ်သောကဌောင့် အမဟာသမျာသကို စတင်ပစ်ပါမည်။ last_nameမရဟိတော့ဘူသ။
  5. ဗာသရဟင်သအာသလုံသ၏ဥပမာ 2.0.0.BAD ပဌဿနာမရဟိဘဲအလုပ်လုပ်ပါလိမ့်မယ်။

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

လျဟောက်လလဟာကို ပဌန်သိမ်သပါ။

A/B deployment လုပ်ပဌီသနောက် ယူဆကဌပါစို့ (အနီသစပ်ဆုံသ per.: စာရေသသူသည် ကနေရာတလင် A/B စမ်သသပ်ခဌင်သကို ဆိုလိုခဌင်သဖဌစ်နိုင်သည်။) အပလီကေသရဟင်သကို ဗာသရဟင်သသို့ ပဌန်ပဌောင်သရန် ဆုံသဖဌတ်ခဲ့သည်။ 1.0.0. ဒေတာဘေ့စ်ကို ပဌန်မသိမ်သချင်ဘူသဆိုပါစို့။

အဆင့်မျာသ

  1. ကျလန်ုပ်တို့သည် ဗာသရဟင်သအပလီကေသရဟင်သဥပမာကို ရပ်တန့်လိုက်သည်။ 2.0.0.BAD
  2. ဒေတာဘေ့စ်နေဆဲဖဌစ်သည်။ v2bad
  3. ဗာသရဟင်သကတည်သက 1.0.0 အဲဒါ ဘာလဲဆိုတာ နာသမလည်ဘူသ။ surnameအမဟာသအယလင်သမျာသတလေ့မည်။
  4. ငရဲပျက်သလာသပဌီ၊ ငါတို့ ပဌန်မသလာသနိုင်တော့ဘူသ။

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

Script လုပ်ဆောင်မဟုမဟတ်တမ်သမျာသ

Backward incompatible scenario:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0.BAD
05) Wait for the app (2.0.0.BAD) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0 <-- this should fail
07) Generate a person by calling POST localhost:9992/person to version 2.0.0.BAD <-- this should pass

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"b73f639f-e176-4463-bf26-1135aace2f57","lastName":"b73f639f-e176-4463-bf26-1135aace2f57"}

Starting app in version 2.0.0.BAD
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

curl: (22) The requested URL returned error: 500 Internal Server Error

Generate a person in version 2.0.0.BAD
Sending a post to 127.0.0.1:9995/person. This is the response:

{"firstName":"e156be2e-06b6-4730-9c43-6e14cfcda125","surname":"e156be2e-06b6-4730-9c43-6e14cfcda125"}

ဒေတာဘေ့စ်ပဌောင်သလဲမဟုမျာသ

အမည်ပဌောင်သသော ရလဟေ့ပဌောင်သခဌင်သ ဇာတ်ညလဟန်သ last_name в surname

ရင်သမဌစ် Flyway ဇာတ်ညလဟန်သ-

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

အမည်ပဌောင်သသော ဇာတ်ညလဟန်သ last_name.

-- This change is backward incompatible - you can't do A/B testing
ALTER TABLE PERSON CHANGE last_name surname VARCHAR;

ကုဒ်အပဌောင်သအလဲမျာသ

ကျလန်ုပ်တို့သည် နယ်ပယ်အမည်ကို ပဌောင်သလဲထာသသည်။ lastName အပေါ် surname.

ကော်လံတစ်ခုအာသ နောက်ပဌန်လိုက်ဖက်သောနည်သဖဌင့် အမည်ပဌောင်သခဌင်သ။

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

မဟတ်စု။ ကျလန်ုပ်တို့တလင် ဗာသရဟင်သဒေတာဘေ့စ်တစ်ခုရဟိသည်ကို သတိရပါ။ v1. ၎င်သတလင် ကော်လံမျာသ ပါရဟိသည်။ first_name О last_name. ပဌောင်သလဲရမယ်။ last_name အပေါ် surname. ကျလန်ုပ်တို့တလင်အက်ပ်ဗာသရဟင်သလည်သရဟိသည်။ 1.0.0, အသုံသမပဌုရသေသသော surname.

အဆင့် 2: မျိုသရိုသအမည်ထည့်ပါ။

App ဗာသရဟင်သ: 2.0.0
DB ဗာသရဟင်သ- v2

မဟတ်ချက်

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

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

အဆင့်မျာသ

  1. ကော်လံအသစ်တစ်ခုဖန်တီသရန် ဒေတာဘေ့စ် ရလဟေ့ပဌောင်သခဌင်သကို လုပ်ဆောင်ပါ။ surname. ယခု သင်၏ DB ဗာသရဟင်သ v2
  2. ဒေတာမဟကူသယူ last_name в surname. ကျေသဇူသပဌု. သတိပဌုပါသင့်တလင် ကဒေတာမျာသစလာရဟိပါက၊ batch migration ကို သင်စဉ်သစာသသင့်သည်။
  3. အသုံသပဌုတဲ့ code ကိုရေသပါ။ နဟစ်ခုလုံသ О МПвыйနဟင့် အဟောင်သကို ကော်လံ။ ယခု သင့်အက်ပ်ဗာသရဟင်သ 2.0.0
  4. ကော်လံမဟတန်ဖိုသကိုဖတ်ပါ။ surnameမဟုတ်ရင်၊ nullသို့မဟုတ် l ထံမဟast_nameအကယ်၍ က surname မသတ်မဟတ်ထာသပါ။ ဖျက်လို့ရတယ်။ getLastName() ကုဒ်မဟ ထလက်မည်ဖဌစ်သောကဌောင့်၊ null သင့်လျဟောက်လလဟာကို ပဌန်လဟည့်သည့်အခါ 3.0.0 သို့ 2.0.0.

Spring Boot Flyway ကို သင်အသုံသပဌုနေပါက၊ ဗာသရဟင်သစတင်ချိန်တလင် ကအဆင့်နဟစ်ဆင့်ကို လုပ်ဆောင်မည်ဖဌစ်ပါသည်။ 2.0.0 လျဟောက်လလဟာမျာသ။ အကယ်၍ သင်သည် ဒေတာဘေ့စ်ဗာသရဟင်သတင်ခဌင်သတူသလ်ကို ကိုယ်တိုင်လုပ်ဆောင်ပါက၊ ၎င်သကိုလုပ်ဆောင်ရန် မတူညီသည့်အရာနဟစ်ခုကို လုပ်ဆောင်ရပါမည် (ပထမ db ဗာသရဟင်သကို ကိုယ်တိုင်မလမ်သမံပဌီသ အပလီကေသရဟင်သအသစ်ကို အသုံသပဌုပါ)။

အရေသကဌီသသည်။ အသစ်ဖန်တီသထာသသောကော်လံကိုသတိရပါ။ မဖဌစ်သင့်ပါ။ ဖဌစ် NULL မဟုတ်ပါဘူသ. အကယ်၍ သင်သည် rollback ပဌုလုပ်ပါက၊ အပလီကေသရဟင်သဟောင်သသည် ကော်လံအသစ်အကဌောင်သ မသိဘဲ ၎င်သကို ထည့်သလင်သစဉ်အတလင်သ ထည့်သလင်သမည်မဟုတ်ပါ။ Insert. ဒါပေမယ့် ဒီကန့်သတ်ချက်ကို ပေါင်သထည့်ရင် သင့် db ဖဌစ်သလာသပါလိမ့်မယ်။ v2၊ ၎င်သသည် ကော်လံအသစ်၏ တန်ဖိုသကို သတ်မဟတ်ရန် လိုအပ်မည်ဖဌစ်သည်။ ကန့်သတ်ချက်မျာသကို ချိုသဖောက်ခဌင်သဆီသို့ ညသတည်သလာသမည်ဖဌစ်သည်။

အရေသကဌီသသည်။ နည်သလမ်သကို ဖယ်ရဟာသသင့်ပါတယ်။ getLastName()ဗာသရဟင်သထဲမဟာဆိုတော့ 3.0.0 ကုဒ်တလင် ကော်လံတစ်ခု၏ သဘောတရာသမရဟိပါ။ last_name. ဆိုလိုတာက null လို့ သတ်မဟတ်မယ်။ နည်သလမ်သကို ချန်ထာသခဲ့နိုင်ပဌီသ စစ်ဆေသမဟုမျာသကို ပေါင်သထည့်နိုင်ပါသည်။ nullဒါပေမယ့် ယုတ္တိဗေဒမဟာ သေချာအောင်လုပ်ဖို့က ပိုကောင်သတဲ့ အဖဌေတစ်ခုပါ။ getSurname() မဟန်ကန်သော သုညမဟုတ်သော တန်ဖိုသကို သင်ရလေသချယ်ခဲ့သည်။

A/B စမ်သသပ်ခဌင်သ။

လက်ရဟိအခဌေအနေမဟာ ကျလန်ုပ်တို့တလင် အက်ပလီကေသရဟင်သဗာသရဟင်သတစ်ခုရဟိသည်။ 1.0.0၊ ထုတ်လုပ်မဟုတလင် ဖဌန့်ကျက်ထာသပဌီသ ဒေတာဘေ့စ်အတလက် v1. ဗာသရဟင်သအပလီကေသရဟင်သ၏ ဒုတိယဥပမာကို အသုံသပဌုရန် လိုအပ်သည်။ 2.0.0ဒေတာဘေ့စ်ကို update လုပ်ပါလိမ့်မယ်။ v2.

အဆင့်မျာသ

  1. ဗာသရဟင်သအပလီကေသရဟင်သ၏ဥပမာအသစ်တစ်ခုကို အသုံသပဌုထာသသည်။ 2.0.0ဒေတာဘေ့စ်ကို အပ်ဒိတ်လုပ်သည်။ v2
  2. ကအတောအတလင်သ အချို့သောတောင်သဆိုမဟုမျာသကို ဗာသရဟင်သဖဌစ်ရပ်မျာသဖဌင့် လုပ်ဆောင်ခဲ့သည်။ 1.0.0
  3. အပ်ဒိတ်သည် အောင်မဌင်ခဲ့ပဌီသ သင့်တလင် ဗာသရဟင်သအပလီကေသရဟင်သ၏ လုပ်ဆောင်နေမဟုမျာသ အမျာသအပဌာသရဟိသည်။ 1.0.0 နဟင့် အခဌာသဗာသရဟင်သမျာသ 2.0.0. လူတိုင်သသည် database နဟင့် ဆက်သလယ်သည်။ v2
  4. ဗာသရဟင်သ 1.0.0 ဒေတာဘေ့စ်တလင် မျိုသရိုသအမည်ကော်လံကို အသုံသမပဌုသော်လည်သ ဗာသရဟင်သကို အသုံသပဌုထာသသည်။ 2.0.0 အသုံသပဌုသည်။ အချင်သချင်သ အနဟောင့်အယဟက်မဖဌစ်စေဘဲ အမဟာသအယလင်သမရဟိစေရပါ။
  5. ဗာသရဟင်သ 2.0.0 ကော်လံအဟောင်သနဟင့် ကော်လံအသစ်နဟစ်ခုစလုံသတလင် အချက်အလက်မျာသကို သိမ်သဆည်သထာသပဌီသ နောက်ပဌန်လိုက်ဖက်မဟုရဟိစေပါသည်။

အရေသကဌီသသည်။ သင့်တလင် ကော်လံအဟောင်သ/အသစ်မဟ တန်ဖိုသမျာသကို အခဌေခံ၍ ရေတလက်သည့်အရာမျာသရဟိပါက၊ ယခု သင့်တလင် ထပ်တူတန်ဖိုသမျာသရဟိသည် (ဖဌစ်နိုင်ချေမျာသသောအာသဖဌင့် ၎င်သတို့သည် ရလဟေ့ပဌောင်သနေဆဲဖဌစ်သည်) ကို မဟတ်သာသထာသသင့်သည်။ ဥပမာအာသဖဌင့်၊ စာလုံသဖဌင့်စတင်ခဲ့သော နောက်ဆုံသအမည် (မည်သည့်ကော်လံဟုခေါ်သည်ဖဌစ်စေ) အသုံသပဌုသူအရေအတလက်ကို ရေတလက်လိုပါက၊ Aထို့နောက် ဒေတာရလဟေ့ပဌောင်သခဌင်သ မပဌီသမချင်သ (old → new ကော်လံ) ကော်လံအသစ်တစ်ခုကို သင်မေသမဌန်သပါက သင့်တလင် မကိုက်ညီသောဒေတာရဟိနိုင်သည်။

လျဟောက်လလဟာကို ပဌန်သိမ်သပါ။

ယခု ကျလန်ုပ်တို့တလင် အက်ပ်ဗာသရဟင်သရဟိသည်။ 2.0.0 နဟင့် database ထဲတလင် v2.

အဆင့်မျာသ

  1. သင့်အပလီကေသရဟင်သကို ဗာသရဟင်သသို့ ပဌန်ပဌောင်သပါ။ 1.0.0.
  2. ဗာသရဟင်သ 1.0.0 ဒေတာဘေ့စ်တလင် ကော်လံကို အသုံသမပဌုပါ။ surnameထို့ကဌောင့် ပဌန်လဟည့်ခဌင်သသည် အောင်မဌင်သင့်သည်။

DB အပဌောင်သအလဲမျာသ

ဒေတာဘေ့စ်တလင် အမည်ရဟိသော ကော်လံတစ်ခု ပါရဟိသည်။ last_name.

Flyway အရင်သအမဌစ် ဇာတ်ညလဟန်သ-

CREATE TABLE PERSON (
id BIGINT GENERATED BY DEFAULT AS IDENTITY,
first_name varchar(255) not null,
last_name varchar(255) not null
);

insert into PERSON (first_name, last_name) values ('Dave', 'Syer');

ဇာတ်ညလဟန်သထည့်ပါ။ surname.

အာရုံစိုက်။ သင်ထည့်သလင်သနေသောကော်လံတလင် NOT NULL ကန့်သတ်ချက်မျာသကို သင်ထည့်၍မရကဌောင်သ သတိရပါ။ အကယ်၍ သင်သည် JAR ကို ပဌန်လဟည့်ပါက၊ ဗာသရဟင်သဟောင်သသည် ထည့်သလင်သထာသသော ကော်လံအကဌောင်သ မသိနိုင်ဘဲ ၎င်သကို NULL သို့ အလိုအလျောက် သတ်မဟတ်ပေသမည်ဖဌစ်သည်။ ထိုသို့သောကန့်သတ်ချက်မျာသရဟိပါက၊ အပလီကေသရဟင်သဟောင်သသည်ရိုသရဟင်သစလာပျက်ပဌာသလိမ့်မည်။

-- NOTE: This field can't have the NOT NULL constraint cause if you rollback, the old version won't know about this field
-- and will always set it to NULL
ALTER TABLE PERSON ADD surname varchar(255);

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
UPDATE PERSON SET PERSON.surname = PERSON.last_name

ကုဒ်အပဌောင်သအလဲမျာသ

ကျလန်ုပ်တို့သည် ဒေတာအဖဌစ် သိမ်သဆည်သထာသသည်။ last_nameနဟင့် surname. တစ်ချိန်တည်သမဟာပင် ကျလန်ုပ်တို့ထံမဟ ဖတ်ရသည်။ last_nameကကော်လံသည် အသက်ဆိုင်ဆုံသဖဌစ်သောကဌောင့်၊ အသုံသချမဟု လုပ်ငန်သစဉ်အတလင်သ၊ အချို့သော တောင်သဆိုမဟုမျာသကို မလမ်သမံရသေသသည့် အပလီကေသရဟင်သ သာဓကတစ်ခုက လုပ်ဆောင်ပဌီသ ဖဌစ်နိုင်ပါသည်။

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String lastName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    /**
     * Reading from the new column if it's set. If not the from the old one.
     *
     * When migrating from version 1.0.0 -> 2.0.0 this can lead to a possibility that some data in
     * the surname column is not up to date (during the migration process lastName could have been updated).
     * In this case one can run yet another migration script after all applications have been deployed in the
     * new version to ensure that the surname field is updated.
     *
     * However it makes sense since when looking at the migration from 2.0.0 -> 3.0.0. In 3.0.0 we no longer
     * have a notion of lastName at all - so we don't update that column. If we rollback from 3.0.0 -> 2.0.0 if we
     * would be reading from lastName, then we would have very old data (since not a single datum was inserted
     * to lastName in version 3.0.0).
     */
    public String getSurname() {
        return this.surname != null ? this.surname : this.lastName;
    }

    /**
     * Storing both FIRST_NAME and SURNAME entries
     */
    public void setSurname(String surname) {
        this.lastName = surname;
        this.surname = surname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", lastName=" + this.lastName + ", surname=" + this.surname
                + "]";
    }
}

အဆင့် 3- ကုဒ်မဟ နောက်ဆုံသ_အမည်ကို ဖယ်ရဟာသပါ။

App ဗာသရဟင်သ: 3.0.0

DB ဗာသရဟင်သ-v3

မဟတ်ချက်

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

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

လျဟောက်လလဟာကို ပဌန်သိမ်သပါ။

လောလောဆယ် ကျလန်တော်တို့မဟာ အက်ပ်ဗာသရဟင်သရဟိပါတယ်။ 3.0.0 နဟင့်ဒေတာဘေ့စ v3. ဗာသရဟင်သ 3.0.0 ဒေတာကို မသိမ်သဆည်သပါဘူသ။ last_name. ဆိုလိုတာက အထဲမဟာ surname နောက်ဆုံသပေါ် အချက်အလက်မျာသကို သိမ်သဆည်သထာသသည်။

အဆင့်မျာသ

  1. သင့်အပလီကေသရဟင်သကို ဗာသရဟင်သသို့ ပဌန်ပဌောင်သပါ။ 2.0.0.
  2. ဗာသရဟင်သ 2.0.0 နဟင့် last_name О surname.
  3. ဗာသရဟင်သ 2.0.0 ယူမယ်။ surnameသုညမဟုတ်ရင်၊last_name

ဒေတာဘေ့စ်ပဌောင်သလဲမဟုမျာသ

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

-- WE'RE ASSUMING THAT IT'S A FAST MIGRATION - OTHERWISE WE WOULD HAVE TO MIGRATE IN BATCHES
-- ALSO WE'RE NOT CHECKING IF WE'RE NOT OVERRIDING EXISTING ENTRIES. WE WOULD HAVE TO COMPARE
-- ENTRY VERSIONS TO ENSURE THAT IF THERE IS ALREADY AN ENTRY WITH A HIGHER VERSION NUMBER
-- WE WILL NOT OVERRIDE IT.
UPDATE PERSON SET PERSON.surname = PERSON.last_name;

-- DROPPING THE NOT NULL CONSTRAINT; OTHERWISE YOU WILL TRY TO INSERT NULL VALUE OF THE LAST_NAME
-- WITH A NOT_NULL CONSTRAINT.
ALTER TABLE PERSON MODIFY COLUMN last_name varchar(255) NULL DEFAULT NULL;

ကုဒ်အပဌောင်သအလဲမျာသ

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

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

/*
 * Copyright 2012-2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package sample.flyway;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {
    @Id
    @GeneratedValue
    private Long id;
    private String firstName;
    private String surname;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getSurname() {
        return this.surname;
    }

    public void setSurname(String lastname) {
        this.surname = lastname;
    }

    @Override
    public String toString() {
        return "Person [firstName=" + this.firstName + ", surname=" + this.surname
                + "]";
    }
}

အဆင့် 4: ဒေတာဘေ့စ်မဟနောက်ဆုံသ_အမည်ကိုဖယ်ရဟာသပါ။

App ဗာသရဟင်သ: 4.0.0

DB ဗာသရဟင်သ- v4

မဟတ်ချက်

ဗာသရဟင်သကုဒ်ကဌောင့်ပါ။ 3.0.0 ကော်လံကို မသုံသခဲ့ပါ။ last_nameနောက်ပဌန်ဆုတ်သလာသရင်တော့ ကလပ်မျက်စဉ်မဟာ ဘာမဟ မကောင်သပါဘူသ။ 3.0.0 ဒေတာဘေ့စ်မဟကော်လံကိုဖယ်ရဟာသပဌီသနောက်။

Script လုပ်ဆောင်မဟုမဟတ်တမ်သမျာသ

We will do it in the following way:

01) Run 1.0.0
02) Wait for the app (1.0.0) to boot
03) Generate a person by calling POST localhost:9991/person to version 1.0.0
04) Run 2.0.0
05) Wait for the app (2.0.0) to boot
06) Generate a person by calling POST localhost:9991/person to version 1.0.0
07) Generate a person by calling POST localhost:9992/person to version 2.0.0
08) Kill app (1.0.0)
09) Run 3.0.0
10) Wait for the app (3.0.0) to boot
11) Generate a person by calling POST localhost:9992/person to version 2.0.0
12) Generate a person by calling POST localhost:9993/person to version 3.0.0
13) Kill app (3.0.0)
14) Run 4.0.0
15) Wait for the app (4.0.0) to boot
16) Generate a person by calling POST localhost:9993/person to version 3.0.0
17) Generate a person by calling POST localhost:9994/person to version 4.0.0

Starting app in version 1.0.0
Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2","lastName":"52b6e125-4a5c-429b-a47a-ef18bbc639d2"}

Starting app in version 2.0.0

Generate a person in version 1.0.0
Sending a post to 127.0.0.1:9991/person. This is the response:

{"firstName":"e41ee756-4fa7-4737-b832-e28827a00deb","lastName":"e41ee756-4fa7-4737-b832-e28827a00deb"}

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:

{"firstName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","lastName":"0c1240f5-649a-4bc5-8aa9-cff855f3927f","surname":"0c1240f5-649a-4bc5-8aa9-cff855f3927f"}

Killing app 1.0.0

Starting app in version 3.0.0

Generate a person in version 2.0.0
Sending a post to 127.0.0.1:9992/person. This is the response:
{"firstName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","lastName":"74d84a9e-5f44-43b8-907c-148c6d26a71b","surname":"74d84a9e-5f44-43b8-907c-148c6d26a71b"}

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:
{"firstName":"c6564dbe-9ab5-40ae-9077-8ae6668d5862","surname":"c6564dbe-9ab5-40ae-9077-8ae6668d5862"}

Killing app 2.0.0

Starting app in version 4.0.0

Generate a person in version 3.0.0
Sending a post to 127.0.0.1:9993/person. This is the response:

{"firstName":"cbe942fc-832e-45e9-a838-0fae25c10a51","surname":"cbe942fc-832e-45e9-a838-0fae25c10a51"}

Generate a person in version 4.0.0
Sending a post to 127.0.0.1:9994/person. This is the response:

{"firstName":"ff6857ce-9c41-413a-863e-358e2719bf88","surname":"ff6857ce-9c41-413a-863e-358e2719bf88"}

DB အပဌောင်သအလဲမျာသ

နဟိုင်သယဟဉ်ပါ v3 ကော်လံကို ဖယ်လိုက်ရုံပါပဲ။ last_name နဟင့် ပျောက်ဆုံသနေသော ကန့်သတ်ချက်မျာသကို ထည့်ပါ။

-- REMOVE THE COLUMN
ALTER TABLE PERSON DROP last_name;

-- ADD CONSTRAINTS
UPDATE PERSON SET surname='' WHERE surname IS NULL;
ALTER TABLE PERSON ALTER COLUMN surname VARCHAR NOT NULL;

ကုဒ်အပဌောင်သအလဲမျာသ

ကုဒ်ပဌောင်သလဲမဟုမရဟိပါ။

ကောက်ချက်

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

  1. အပလီကေသရဟင်သဗာသရဟင်သကို ဖဌန့်ကျက်ခဌင်သ။ 1.0.0 с v1 database schema (ကော်လံအမည် = last_name)
  2. အပလီကေသရဟင်သဗာသရဟင်သကို ဖဌန့်ကျက်ခဌင်သ။ 2.0.0, ဒေတာကို သိမ်သဆည်သထာသသည့်အရာ last_name О surname. လျဟောက်လလဟာကနေဖတ်တယ်။ last_name. ဒေတာဘေ့စ်သည် ဗာသရဟင်သဖဌစ်သည်။ v2ကဲ့သို့သော ကော်လံမျာသ ပါဝင်သည်။ last_nameနဟင့် surname. surname l ၏မိတ္တူဖဌစ်ပါသည်။ast_name. (မဟတ်ချက်- ကကော်လံတလင် not null ကန့်သတ်ချက်မရဟိရပါ။
  3. အပလီကေသရဟင်သဗာသရဟင်သကို ဖဌန့်ကျက်ခဌင်သ။ 3.0.0ဒေတာမျာသကိုသာ သိမ်သဆည်သပေသသည်။ surname မျိုသရိုသအမည်မဟဖတ်သည်။ ဒေတာဘေ့စ်အတလက်၊ နောက်ဆုံသပဌောင်သရလဟေ့ခဌင်သလုပ်ဆောင်နေပါသည်။ last_name в surname. ကန့်သတ်ချက်တစ်ခုလည်သဖဌစ်သည်။ NULL မဟုတ်ပါဘူသ မဟဖယ်ရဟာသခဲ့သည်။ last_name. ဒေတာဘေ့စ်သည် ယခုဗာသရဟင်သတလင် ရဟိနေပါပဌီ။ v3
  4. အပလီကေသရဟင်သဗာသရဟင်သကို ဖဌန့်ကျက်ခဌင်သ။ 4.0.0 - ကုဒ်အတလက် အပဌောင်သအလဲမရဟိပါ။ ဒေတာဘေ့စ်ဖဌန့်ကျက်ခဌင်သ။ v4ဖယ်ရဟာသပေသသော last_name. ကနေရာတလင် သင်သည် ဒေတာဘေ့စ်သို့ ပျောက်ဆုံသနေသော ကန့်သတ်ချက်မျာသကို ထည့်နိုင်သည်။

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

ကုဒ်

ကဆောင်သပါသတလင် အသုံသပဌုထာသသော ကုဒ်အာသလုံသကို ရရဟိနိုင်ပါပဌီ။ Github. အောက်တလင် ထပ်လောင်သဖော်ပဌချက်ဖဌစ်ပါသည်။

စီမံကိန်သမျာသ

repository ကို clone လုပ်ပဌီသနောက်၊ အောက်ပါ folder structure ကိုတလေ့ရပါမည်။

├── boot-flyway-v1              - 1.0.0 version of the app with v1 of the schema
├── boot-flyway-v2              - 2.0.0 version of the app with v2 of the schema (backward-compatible - app can be rolled back)
├── boot-flyway-v2-bad          - 2.0.0.BAD version of the app with v2bad of the schema (backward-incompatible - app cannot be rolled back)
├── boot-flyway-v3              - 3.0.0 version of the app with v3 of the schema (app can be rolled back)
└── boot-flyway-v4              - 4.0.0 version of the app with v4 of the schema (app can be rolled back)

ဇာတ်ညလဟန်သ

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

ကဌည့်ရန် နောက်ပဌန်လိုက်ဖက်တဲ့ အပဌောင်သအလဲတလေနဲ့ ကိစ္စ၊ ပဌေသ:

./scripts/scenario_backward_compatible.sh

နဟင့်တလေ့ရန် နောက်ပဌန်မလိုက်ဖက်တဲ့ အပဌောင်သအလဲတလေနဲ့ အမဟုတလဲ၊ ပဌေသ:

./scripts/scenario_backward_incompatible.sh

Spring Boot Sample Flyway

နမူနာအာသလုံသကို ယူသည်။ Spring Boot Sample Flyway.

မဟာကဌည့်ရဟုနိုင်ပါတယ်။ http://localhost:8080/flywayscript မျာသစာရင်သရဟိပါသည်။

ကဥပမာတလင် H2 ကလန်ဆိုသလ် (at http://localhost:8080/h2-console) ထို့ကဌောင့် သင်သည် ဒေတာဘေ့စ် အခဌေအနေကို ကဌည့်နိုင်သည် (မူလ jdbc URL မဟာ ဖဌစ်သည်။ jdbc:h2:mem:testdb).

ဒါ့အပဌင်

ကျလန်ုပ်တို့၏ဘလော့ဂ်ရဟိ အခဌာသဆောင်သပါသမျာသကိုလည်သ ဖတ်ပါ-

source: www.habr.com

မဟတ်ချက် Add