Showing posts with label Java and DB. Show all posts
Showing posts with label Java and DB. Show all posts

Tuesday, March 16, 2010

Auto Increment ID

တစ္ခါတစ္ေလ ဒီလိုမ်ိဳးေလးမလား ၾကံဳဖူးမလားမသိဘူး။
Database Table ႏွစ္ခုရိွတယ္ဆုိပါေတာ႔။
Hibernate မသံုးတဲ႔ ရိုးရုိး ကိစၥေလးေတြမွာေျပာတာပါ။

ပထမ table ကို TableA လုိ႕ထားပါေတာ႔။
ဒုတိယ table က TableB. TableA မွာ Id က auto increment လုပ္ထားတယ္။

ရိုးသားၾကိဳးစားတဲ႔ DB Admin က normalize ေသခ်ာလုပ္ထားတဲ႔အတြက္ TableA ရဲ႕ primary key က TableB မွာ Foreign key အျဖစ္နဲ႕ ရိွပါတယ္။ ကြ်န္ေတာ္တို႕လုပ္ရမွာက Table A မွာ record တစ္ခုထည္႕လုိက္ျပီးတုိင္း TableB မွာ အဲဒီ ID ကို Foreign key အေနနဲ႕သံုးထားတဲ႔ ေနာက္ထပ္ Record တစ္ခုကို ထည္႕ရပါမယ္။
နမူနာပံုေလးကို ၾကည္႕ပါ။

Table A

ID Name NRIC
1 Zero 140222


Table B

ID ---- TableA_ID ----- Address
1 -------- 1 ---------------- Eunos Rainbow


အဲဒီလို record တစ္ေၾကာင္းစီ ထည္႕ခ်င္တာပါ။ ကြ်န္ေတာ္ေျပာခ်င္တာက Table A ကို row တစ္ခု insert လုပ္တာက ငွက္ေပ်ာသီး အခြံႏႊာတာထက္လြယ္ပါတယ္။ ေနာက္ေတာ႔ ID ကို ျပန္ရွာရတာက ပ်င္းစရာေကာင္းပါတယ္။ Select ျပန္လုပ္ရင္ရေပမယ္႔ ပ်င္းပါတယ္။ အဲဒီလို မလုိအပ္တဲ႔ code ေတြေရးမယ္႔အတူတူေတာ႔ ဘာလို႕ Developer လုပ္မွာလဲ ... ေဆာ႔ခေရတၱိေခတ္က စာကူးတဲ႔သူသြားလုပ္ေနမွာေပါ႔။ အဲဒီလုိ ငပ်င္းေတြအတြက္ တစ္ခုလုပ္လုိ႕ရတာရိွပါတယ္။ auto increment လုပ္ထားတဲ႔ ID ကို ျပန္ယူလိုက္လုိ႕ရပါတယ္။ စိတ္ခ်မ္းသာစရာေကာင္းပါတယ္။ မဟုတ္ရင္ ေနာက္တစ္ခါ သြား select လုပ္ရတဲ႔အတြက္ connection လည္းေျခေထာက္ေညာင္းမွာပဲ။ လူအေယာက္ တစ္သန္းသံုးတဲ႔ System မွာဆို အခ်ိန္အမ်ားၾကီးကုန္သြားမယ္။ ေလးငါးဆယ္ေယာက္ေလာက္သံုးဖုိ႕အတြက္ေတာ႔ System မလုိပါဘူး။ လက္နဲ႕ပဲ ေကာက္ေရးထားလုိက္ရင္ ရတာပါပဲ။ ပံုမွန္ အားျဖင္႔ Developer တစ္ေယာက္ဟာ database ကို တတ္ႏိုင္သေလာက္ အသြားအလာေလွ်ာ႔ရပါမယ္။ တစ္ခါသြားျပီး အကုန္ယူလုိ႕ရတာ ယူႏိုင္ရပါမယ္။ မယူႏုိင္ဘူးဆိုရင္ ကိုယ္႔ SQL ကို ျမွင္႔တင္ဖုိ႕လိုပါတယ္။ မဟုတ္ရင္ သြားတယ္ျပန္တယ္...ျပန္သြားတယ္ ထပ္သြားဦးမယ္ဆိုရင္ System ကေလးတယ္ ပိုေလးတယ္ ...အလုပ္မလုပ္ေတာ႔ေလာက္ေအာင္ေႏွးတယ္၊ DB sever ရဲ႕ CPU က ၁၀၀ရာခုိင္ႏႈန္း ကေနကို ျပန္က်မလာေတာ႔ဘူး။ အဲဒါမ်ဳိဳးေတြျဖစ္မယ္။ အဲဒီလိုေျပာင္ေျပာင္ေျမာက္ေျမာက္ ဒုကေပးတတ္တဲ႔ ခပ္ညံ႕ညံ႔ developer ေတြရဲ႕ code ကို boiler-plate code ေတြလုိ႕ေခၚပါတယ္။ maintain လုပ္ရတဲ႔သူကေတာ႔ ေမတၱာ အၾကိမ္ၾကိမ္ပို႕မွာ အေသအခ်ာပါပဲ။

အင္း ... အဲဒီ auto increment id ေလးျပန္ယူတာေလးေရးၾကည္႕ပါမယ္။
PreparedStatement pst = conn.prepareStatement(sQuery,Statement.RETURN_GENERATED_KEYS);
ResultSet rs = pst.getGeneratedKeys();
rs.next();
autoId = rs.getInt(1);

အဲဒီလိုေလးေရးလုိက္ရင္ autoId ကို ေနာက္တစ္ခါ ထပ္သြားမယူဘဲ သိရပါတယ္။ အသြားအလာ သက္သာသြာပါတယ္။ ေျခေထာက္မေညာင္းေတာ႔ပါဘူး။ အဲဒီ autoId ေလးကို ေကာက္ျပီး ဒုတိယ TableB မွာ insert လုပ္လုိက္ပါ။ မ်ားမ်ားစဥ္းစားျပီးနည္းနည္းပဲ အလုပ္လုပ္ပါ။ လြယ္တဲ႔နည္းေတြ ထြင္ထားျပိးသားရိွပါတယ္။ မ်ားမ်ားေလ႔လာျပီး သက္သာေအာင္ေနပါ။

သိပ္ပ်င္းတဲ႔သူေတြပဲ ထူးခြ်န္ႏိုင္တယ္။
try and error နည္းက လူပင္ပန္းသေလာက္ အက်ိဳးမရိွဘူး။ တြက္ေျခမကိုက္ဘူး။
work hard ဆိုတဲ႔စကားလံုးကို Developer ေတြမွာမသံုးပါဘူး။ Work smart လုိ႕ပဲ သံုးပါတယ္။ ပ်င္းတဲ႔သူဟာ Smart ၾကတဲ႕နည္းေတြအမ်ားၾကီးသိပါတယ္။ work hard ၾကီးေတြကို လူၾကီးေတြက ခ်ီးက်ဴးပါတယ္။ Work Smart ေတြကိုေတာ႔ ေလးစားၾကပါတယ္။ သက္သက္သာသာေလး ေလးစားခံထုိက္တဲ႔သူေတြျဖစ္ေအာင္ ၾကိဳးစားႏိုင္ၾကပါေစ။

Commit and Rollback

ဆုိၾကပါေတာ႔ ...။
လူတစ္ေယာက္က ပစၥည္းတစ္ခုကို ၀ယ္တယ္။
Discount ရတယ္။
ကံစမ္းမဲအတြက္လည္း သူ႕စာရင္းကို သြင္းတယ္။
Database View နဲ႕ Table သံုးခုလို႕ပဲ ယူဆလုိက္ပါ။

ပစၥည္း၀ယ္ေတာ႔ Purchase ဆိုတဲ႔ table မွာ တစ္ေၾကာင္း၊
Discount ရေတာ႔ Discount table မွာ တစ္ေၾကာင္း၊
Lucky Draw အတြက္ Lucky Draw table မွာတစ္ေၾကာင္း စုစုေပါင္း table သံုးခုမွာ record row သံုးေၾကာင္း insert လုပ္တယ္ဆုိပါေတာ႔။

ျဖစ္ခ်င္ေတာ႔ အင္တာနက္ၾကီးက လမ္းခုလတ္မွာေဒါင္းသြားတယ္ဆိုပါေတာ႔။Purchase table မွာ ပဲ insert လုပ္ရေသးတယ္။ Discount ေတြ၊ Lucky Draw ေတြမွာ record မေရးခင္လည္း interrupt ျဖစ္တယ္ဆုိပါေတာ႔။ ဘယ္လုိလုပ္မွာလဲ။ ဒီအတိုင္းထားလုိက္ရင္ေတာ႔၊ သူ႕အတြက္ Discount လည္းမရ၊ Lucky Draw လည္းမရတဲ႕ Customer က ဒီ Shopping Mall ၾကီးကို စိတ္အနာၾကီးနာေနေတာ႔မွာ။

လူတစ္ေယာက္တည္းျဖစ္သြားတယ္ဆိုရင္ သိပ္မသိသာဘူး။ အေယာက္ ႏွစ္ေသာင္းေလာက္ တစ္ျပိဳင္နက္၀ယ္ေနုတုန္းျဖစ္တယ္ဆိုပါေတာ႔ ....။ဟဲဟဲ ....။ ေနာက္ဘယ္ေတာ႔မွလာမ၀ယ္ေတာ႔ဘူးဆို မခက္ဘူးလား။

လူေတြလည္း သီးခ်ိန္တန္သီးပြင္႔ခ်ိန္တန္ပြင္႔ရသလို ... prepared statement ေတြလည္း commit ခ်ိန္တန္ commit ...rollback ခ်ိန္တန္ rollback ရတယ္။ အဲဒါဆို ... half way ျဖစ္ေနတဲ႔ process က rollback ျပန္လုပ္လုိက္တဲ႔အတြက္ တစ္၀က္တစ္ပ်က္ျဖစ္မေနေတာ႔ဘူး။ ေနာက္တစ္ခု ျပန္ျပီး upload လုပ္လုိက္ရံုပဲ။ ဒါကလည္း အျမဲတမ္းဂရုစိုက္ရမယ္႔အခ်က္ျဖစ္ပါတယ္။

ဘယ္ေနရာမွာပဲလုပ္ေနလုပ္ေန Java Developer တစ္ေယာက္ဟာ အျမဲတမ္း standard က်တဲ႔ procedure နဲ႕ ေရးဖုိ႕ ၾကိဳးစားေစခ်င္ပါတယ္။ ကိုယ္ေရးထားတဲ႔ codes ကို သိၾကားမင္း ဆင္းျပီး bug လုပ္ေတာင္ မရဘူးကြ ဆိုတာမ်ိဳး ေရးႏို္င္ဖုိ႕ၾကိဳးစားရပါမယ္။ အထူးသျဖင္႔ မေရးခင္ အားလံုး ကို စဥ္းစားပါ။ ေပ်ာ္ေပ်ာ္ၾကီး ခ်မေရးခ်င္ သူ႕ရဲ႕ business logic ကို flow chart ေလးျဖစ္ျဖစ္ အၾကမ္းဆြဲထားလိုက္ပါ။ စာရြက္နဲ႕ျဖစ္ျဖစ္ေပါ႔။ ဒါဆို ဘာေတြ ၾကံဳရႏိုင္လဲဆိုတာကို ပိုသိလာပါလိမ္႔မယ္။ တစ္ခု process ေတြကို scenario တစ္မ်ိဳးထဲမွာ ၾကိတ္ျပီးစဥ္းစားျပီး ေပ်ာ္မေနပါနဲ႕။ တကယ္႔ေလာကၾကီးက ကိုယ္ေတြးထားတာေလးပဲျဖစ္မယ္လုိ႕ အာမမခံထားပါဘူး။


အၾကမ္းဖ်င္းေျပာရရင္ commit အတြက္ autoCommit ကို false ေပးထားပါ။
connection တစ္ခုထဲကိုပဲ parameter အေနနဲ႕ parse လုပ္သြားျပီး table သံုးခုစလံုးကို insert လုပ္ပါ။
အားလံုးျပီးရင္ အဲဒီ connection ကို commit လုပ္ပါ။
exception ျဖစ္ရင္ rollback ျပန္လုပ္လုိက္ပါ။ အဲဒါဆိုရင္ေတာ႔ စိတ္ခ်ရသေလာက္ရိွပါျပီ။

Java Developer ေတြဟာ ငပ်င္းေတြျဖစ္ပါတယ္။
Codes တစ္ခုကို တစ္သက္လံုး ႏွစ္ခါျပန္မေရးပါဘူး။
Reusable ျဖစ္ေအာင္ေရးျပီး ဘယ္ေနရာမွာမဆို ျပန္သံုးလုိ႕ရေအာင္ ေရးရပါတယ္။
Process တစ္ခုကို Method တစ္ခုေရးျပီး ကိုယ္႔ကိုယ္ကို သက္သာေအာင္ေနပါ။
လူအမ်ားနဲ႕ေရးတဲ႔အခါ ... ကိုယ္႔ codes ေတြလူမ်ားၾကည္႕ျပီး ထုိင္မငိုပါေစနဲ႕ ...။
ႏွစ္ခါသံုးခါ ေရးရမယ္႔ method ေတြကို သပ္သပ္ခြဲထုတ္ထားလုိက္ပါ။ Eclipse မွာ ctrl+click ေခါက္ျပီး လုိက္ၾကည္႕လုိ႕ရပါတယ္။ ကိုယ္႔အတြက္ အဆင္ေျပေအာင္ေရးပါ။ နားမလည္မွာစိုးရင္ Comment ေတြကို သပ္သပ္ရပ္ရပ္ေရးပါ။ ျဖစ္ႏုိင္ရင္ comment ကို ရွည္ရွည္ေရးျပီး အၾကမ္းဖ်င္းရွင္းျပပါ။ ဒါဟာ ေနာက္လူအတြက္ သိပ္ေကာင္းပါတယ္။ ေရွ႕က ေရးသြားတဲ႔သူ ညံ႕တိုင္း လုိက္မညံ႕တဲ႔ developer ျဖစ္ႏိုင္ပါေစ။
အခုေရးထားတဲ႔ post ေလးက သီအိုရီ အေနနဲ႕ပဲေျပာထားပါတယ္။
တကယ္လည္းေရးၾကည္႕ၾကပါမယ္။ အခုလည္း hosting အတြက္ စဥ္းစားေနပါတယ္။ ရံုးက Server တစ္လံုးမွာ host လုပ္ျပီးေရးရင္လည္း illegal ျဖစ္ေနမယ္ ....။

ဘာပဲျဖစ္ျဖစ္ပါဗ်ာ ...။ ကြ်န္ေတာ္တို႕ေတြ ပိုေတာ္တဲ႔ ညီငယ္၊ညီမငယ္ေလးေတြ ဖတ္ႏိုင္ ေလ႔လာႏိုင္ဖို႕ အမ်ားၾကီးေရးျဖစ္မွာပါ။
ျမန္မာေတြဟာ well-educated ေတြဆိုတာကို ကြ်န္ေတာ္တို႕ သက္ေသျပခ်င္ပါတယ္။ ဒီလိုသက္ေသျပႏုိင္ဖို႕ ကြ်န္ေတာ္တို႕ေတြ အားလံုး ၾကိဳးစားေနၾကပါတယ္။

ကိုယ္႔အတြက္ ဘာမွမဟုတ္တာေလးေတြဟာ လုိအပ္ေနတဲ႔ တစ္ေယာက္ေယာက္အတြက္ အဆင္ေျပသြားတာမ်ိဳးျဖစ္သြားႏိုင္တယ္ဆိုကို ယံုၾကည္တဲ႔အတြက္ ဒီထက္ ပိုေကာင္းတဲ႔၊ ပိုစနစ္က်တဲ႔ သင္ခန္းစာေတြနဲ႕ ေဆြးေႏြးမႈေတြကိုလည္း ဆက္ျပီး ေရးသြားပါဦးမယ္။