Wednesday 5 December 2007

ESB มาแทน BPEL จริงเหรอ

ESB (Enterprise Service Bus) เป็น เทคโนโลยีตัวใหม่ของ Oracle มักจะมีคำถามว่า ESB ต่างกับ BPEL อย่างไร จริงๆแล้วมองเผินๆ สองตัวนี้เหมือนกัน แต่ก็มีส่วนต่างกันอยู่ ในเรื่องของ low cost , performance การที่ Oracle สร้าง ESB ขึ้นมาก็เพื่อตอบสนองกับการเปลี่ยนแปลง Business Flow บ่อยๆ ซึ่งเมื่อก่อนการเปลี่ยนแปลงเราจะต้องมาแก้ไขที่ BPEL แล้วทำให้ต้องมีการ deploy ใหม่อีก แต่ ESB สร้างขึ้นมา ทำให้เราสามารถ config แยกต่างหาก โดยที่ Business Flow หลักไม่ต้องเปลี่ยนแปลงแต่ BPEL มีบางอย่างที่ ESB ไม่มี เช่น Human Work Flow ที่เอาไว้ดู Status ของงานได้ ทำให้การพัฒนาจะต้องมีสองเทคโนโลยีผสมผสานกันไป

ทำความรู้จัก Adapter ใน Oracle SOA กัน

Adapter แปลตรงๆตัวเลย คือ ตัวแปลงนั่นเอง ในยุคของการที่ Business Process กำลังจะเติบโต การที่จะ Integrate กับBackend Application จึงเป็นเรื่องที่สำคัญอย่างยิ่ง ตัว Adapter นี่หละครับ พระเอกของการ Integrate เลยทีเดียวไม่ว่าจะ integrate เข้ากับ Software Package หรือไม่ก็อยากดึงข้อมูลจาก Database ก็ทำได้ หรือจะดึงจาก Webservice ล้วนมีส่วนช่วยให้การ integrate เร็วขึ้น ลดภาระลง โดย Adapter แบ่งออกเป็น 3 ประเภทด้วยกัน คือ

1. Technology Adapters

Adapter พวกนี้จะทำการ integrate ในพวก transport protocols หรือไม่ก็ data stores หรือไม่ก็พวก messaging Adapter พวกนี้ได้แก่ Adapter for FTP, Adapter for Database, Adapter for MQ เป็นต้น

2. Packaged-Application Adapters

Packaged Application ERP ที่ดังๆ ทั้งหลาย เช่น SAP, PeopleSoft, Oracle Applications, Siebel Oracle provide Adapter ไว้ให้แล้ว

3. Legacy Adapters

legacy หรือ mainframe applications ที่ใช้ติดต่อกับ SOA ได้ เพื่อให้ไม่เสียเวลาในการ Implememt ใหม่ โดย Oracle ก็เตรียม Adapter เอาไว้ให้แล้วเช่นกัน ได้แก่ Tuxedo, CICS, VSAM

Tuesday 27 November 2007

http://www.expobadge.com/dldev/dc/alldemogroundslist.cfm?

[ถามต้อม#3] Hit rate ของ database นี่มันคืออะไร? มีผลอะไรกับ database บ้าง?

ถามโดย คุณ Anonymous
รบกวนสอบถามค่ะ คือสงสัยว่า hit rate ของ database นี่มันคืออะไรเหรอคะมีผลอะไรกับ DB บ้างรบกวนท่านผู้รู้หน่อยค่ะ

ตอบ
โดยหลักการทำงานของ Oracle Database นั้น จะมีส่วนที่เรียกว่า Database Buffer Cache โดยส่วนนี้จะทำหน้าที่ Cache เหล่า Data Block ที่ถูก Query ไว้ ซึ่งทุกครั้งที่มีการ Query ข้อมูลต่าง ๆ Oracle ก็จะทำการค้นหาที่ Buffer Cache ก่อน และแสดงผลทันทีเมื่อพบ Data Block ที่ต้องการ (cache hit) ทำให้การค้นหาข้อมูลเร็วขึ้น และช่วยลดการอ่าน Disk โดยตรงอีกด้วย

อย่างไรก็ดี ถ้า Query แล้วไม่เจอ Data Block ที่ต้องการใน Buffer Cache (cache miss) ตัว Oracle ก็จะทำการค้นหาใน Disk แล้ว Copy Data Block ดังกล่าวมาเก็บไว้ที่ Cache ทีนี้จะเก็บได้มากน้อยแค่ไหน ก็ขึ้นกับขนาดของ Cache ที่กำหนด ถ้า Cache เต็ม Oracle ก็จะทำการ move block ที่มีการใช้งานน้อยที่สุด ออกไปก่อน (LRU)

อย่างไรก็ดี Cache ที่มีขนาดใหญ่ไม่ได้ช่วยให้ Performance ของ Database ดีขึ้นเสมอไป การกำหนดขนาดของ Cache ให้เหมาะสมจะช่วยเพิ่ม Performance ของ Database ได้ โดยอาศัยการ monitor ค่า Hit Rate หรือที่ Oracle เรียกว่า Buffer Cache Hit Ratio ซึ่งเป็นการหาอัตราส่วนของ ความถี่ที่ cache hit ต่อด้วยจำนวน total request

ถ้าค่า Buffer Cache Hit Ratio มีค่ามาก แสดงถึงว่ามีการเข้าถึงข้อมูลผ่านทาง Buffer Cache มากกว่าการ read จาก disk โดยตรง อย่างไรก็ดี การ tuning database นั้น ขึ้นกับองค์ประกอบหลายส่วน การ tuning โดยไม่คำนึงถึงส่วนประกอบอื่นๆ อาจส่งผลให้ Performance ของ Database แย่ลงได้ค่ะ

(ถามต้อมคืออะไร?)

Wednesday 21 November 2007

http://www.internetnews.com/breakingnews/article.php/3711466

Oracle Database Recovery

ถัดจากตอนที่แล้ว เรื่องในตอนนี้จะเกี่ยวกับการ Database Recovery เมื่อเกิด Database Files ทั้งหลายเสียหายเราต้องมีวิธีแก้ไข ซึ่งตรงนี้ได้แบ่งการแก้ปัญหาแต่ละ file ดังนี้

Control File เสียหาย

เมื่อ Control File เสียหายจะทำให้ startup database ไม่ขึ้น ถ้าเราพยายาม startup database ถึงแค่ nomount mode ตัวอย่าง ถ้ามี control file 03 เสียหาย
    จะมีวิธีแก้อยู่ 2 วิธี
  • ให้ oracle มาใช้งานแค่ control file 01, 02 แทน โดยแก้ parameter CONTROL_FILES=’…’, ‘…’ ใหม่ให้อ่าน Control file แค่ 2 ตัวที่ใช้งานได้
  • สร้าง control file แทนที่ตัวที่เสียหาย Shutdown database ก่อน แล้วเข้าไปที่ path control file ที่ใช้งานได้แล้ว copy control file ไปวางไว้ใน path control file ที่เสียหาย จากนั้น rename ให้ชื่อเหมือน control file ตัวที่เสียหาย แล้ว startup database ตามปกติก็ใช้งานได้เหมือนเดิม
แต่ในกรณีที่ Control File ทุกตัวเสียหายเราสามารถแก้ไขได้โดยนำ backup control file to trace ที่เป็น option ตอน backup มาใช้งาน ซึ่ง trace เก็บเป็น sql command เราจึงนำมา run ได้เลย โดยไป run ที่ nomount mode การทำ Backup Control File to Trace
NOTE: เมื่อ database มีปัญหาเราควรเข้าไปดู alert log ของ database ซึ่ง path จะถูกกำหนดที่ parameter BACKGROUND_DUMP_DEST (default path: /admin//bdump/alertlog)

Redo Log File เสียหาย

ถ้าใน 1 group มี 2 member แล้วเสียหายไป 1 member database ยังทานได้โดยไม่ส่งผลกระทบอะไรยัง startup database ได้เหมือนเดิม ซึ่งจะไม่เหมือนกับ control file ที่จะ startup database ไม่ได้ ส่วน DBA จะรู้ก่อนต่อเมื่อเข้าไปดูใน alert log
วิธีแก้เมื่อ redo log file เสียหาย ให้ shutdown database จากนั้นเข้าไป copy redo log file ที่ใช้งานได้แล้วนำไปวางใน path ของ redo log file ที่เสียหายแล้ว rename ให้ชื่อเหมือนเดิม

Data File เสียหาย

    ถ้า data file เสียหายจะแบ่งออกได้เป็น 2 แบบคือ

  • Noarchivedlog mode แก้ปัญหาโดย shutdown database ก่อนจากนั้น เอา backup มา restore แต่ข้อมูลที่ได้กลับมาจะเป็นข้อมูลที่ backup ครั้งล่าสุดเอาไว้
  • Archivedlog mode การแก้ต้องทำ 2 ขั้นตอนคือ restore + recovery แบ่งออกเป็น 2 ประเภท

    • 1. Noncritical data file ก็ต่อเมื่อ data file ที่เสียหายนั้นไม่ได้เป็นของ Tablespace system, undo สำหรับเครื่อง production เราต้องทำให้ database กลับมา open ให้ได้ก่อนเพื่อให้ใช้งาน tablespace อื่นที่ไม่เสียหายไปก่อน โดยการ
    • Startup database mount mode
    • ALTER DATABASE DATAFILE <หมายเลข datafile ที่เสียหาย> offline;
    • ALTER DATABASE OPEN;
    • ในระหว่างที่จะเอา backup มาลงควร offline tablespace ก่อน
    • ALTER tablespace <ชื่อ tablespace> offline
    • RMAN sys/oracle (อีก session)
    • RESTORE TABLESPACE <ชื่อ tablespace> ที่จะทำการ resotre); ลองดูใน database physical path น่าจะกลับมาแล้ว
    • RECOVER TABLESPACE <ชื่อ tablespace> online
    • ALTER DATABASE DATAFILE <หมายเลข datafile ที่เสียหาย> online;

      2. Critical data file การแก้ปัญหาต้องทำที่ mount mode เท่านั้น เพราะ tablespace system, undo offline ไม่ได้ จึงไม่สามารถแก้ไขให้ database open เริ่มแก้ไขโดยการ
    • Shutdown database
    • Startup mount
    • RMAN sys/oracle
    • RESTORE TABLESPACE <…>
    • RECOVER TABLESPACE <…>
    • ALTER DATABASE OPEN;

Tuesday 20 November 2007

[ถามต้อม#2] Oracle จะเก็บ log การทำงานของ database ไว้ที่ไหนคะ?

ถามโดย คุณ Anonymous
มีเรื่องรบกวนถามเกี่ยวกับการเก็บ Event Log ของ oracle น่ะคะ
ที่หน่วยงานใช้ oracle ในการเก็บข้อมูลทางด้าน GIS
ซึ่งบ่อยครั้งที่ application ทำงานช้ามาก user บ่นเยอะ
จึงแจ้งไปทางเจ้าของ application ซึ่งเค้าก็มาดูแล้วบอกว่าเป็นที่ database
มี redo log ของ database มันไม่ทำงาน ซึ่งเค้าบอกว่าไปดูจาก log ของ database
มันฟ้องว่า redo log ไม่ทำงาน ถามเค้าว่าดูได้จากไหน เค้าก็ไม่ยอมตอบ
เลยอยากทราบว่าโดยปกติแล้ว oracle จะเก็บ log การทำงานของ database ไว้ที่ไหนคะ
เครื่องเป็นเครื่อง SUN คะ
รบกวนด้วยนะคะ
ขอบคุณมากคะ

ตอบ
ปกติแล้ว Oracle จะมี Alert log ที่ไว้เก็บรายละเอียดการทำงานของ Database ค่ะ
ซึ่งส่วนมากจะเก็บไว้ที่
Path ==> $ORACLE_HOME/admin/bdump
โดยจะมีชื่อไฟล์ว่า alert_[SID].log
ส่วนประเด็นเรื่อง redo log ไม่ทำงาน ขอยังไม่ตอบนะคะ ข้อมูลที่มียังน้อยไป
ไว้ดู log ตาม path ที่ให้ไป ค่อยว่ากันอีกทีค่ะ

(ถามต้อมคืออะไร?)

Presentation ของ OpenWorld ครั้งล่าสุด เปิดให้ download แล้ว

มาแล้วครับ, presentation files ของงาน Oracle OpenWorld สัปดาห์ที่ผ่านมา (11 - 15 November 2007) เปิดให้ download แล้วครับ
มีรายการให้ download ได้ทั้งสิ้นเฉียดพันรายการ ซึ่งนำมาจาก power point ของบรรดา speaker ร่วม 1769 session

จะมีถาม username/password ด้วยครับ, ใช้ account ตามนี้เลยครับ cboracle/oraclec6

เหมาะสำหรับใคร?

  • คนที่ทำงานอยู่ในวงการ Oracle, แน่นอนครับทั้ง technical และ บรรดา presales ต้องไม่พลาด
  • ลูกค้าที่ได้ซื้อ products Oracle, เพื่อดูว่าแนวโน้มของ products ที่ใช้อยู่เป็นอย่างไร
  • คู่แข่ง Oracle, เพื่อดู potential ของ competitors
  • บรรดา Geeks ทั้งหลาย ที่อยากจะดู trends ของ IT
นี่คือ Focus Area ทั้งหมดครับ

Monday 19 November 2007

ภาษา Programming Language ตัวไหนนิยมที่สุด?

วันนี้เรามี chart เกี่ยวกับความฮอตฮิตของภาษาสำหรับ programming มาฝากกันซึ่งไปเจอมาจากเว็บนี้ครับ http://www.langpop.com/ โดยเว็บนี้จะแบ่งออกเป็นเป็นด้านต่างๆ แล้วจึงค่อยมีมาสรุปรวมกันในตอนท้ายว่าใครเป็นภาษาที่ฮิตอย่างแท้จริง ซึ่งถ้าให้เปรียบละก็คงจะเหมือนกับอันดับเพลงของแต่ละคลื่นวิทยุย่อมมีอันดับที่ไม่เหมือนกัน เอาหละโม้มามากแล้วไปดูอันดับแต่ละคลื่นดังนี้

- แบ่งตาม index ของ search engine โดย search engine ที่ใช้นี้เป็นของ yahoo ซึ่งได้ผลตามกราฟดังนี้
สังเกตุว่าภาษา C นี้เค้ายังคงแรงอยู่แม้ว่าจะจะป็นภาษาที่เก่าแก่มีอายุมากแล้วแต่ว่ายังคงมีความเก๋าอยู่ตามติดๆด้วยภาษา Java และ PHP แต่ไม่น่าเชื่อว่า Visual Basic นี้ไม่ติดหนึ่งในสามเลย แต่คงมีคนอาจจะสงสัยว่าทำไมเราถึงไม่ใช้ google ในการ search หละนั้นก็เพราะว่าอันดับของ programming language เก่าที่ทางเว็บ langpop เค้าทำนั้นใช้ google ในการค้นหาดังนั้นเพื่อเกิดความยุติธรรมเค้าจึงใช้ yahoo ในครั้งนี้ สามารถติดตามผลอันดับเก่าๆเก่าได้ที่นี่ http://www.welton.it/articles/language_popularity.html แต่ที่ผมว่ามันเป็นผลอัน “เก่าๆ” นั้นก็เพราะว่ามันเก่าจริงๆเพราะว่าทำมาตั้งแต่ปี 2004 แหนะแต่ว่าสำหรับผลอันดับครั้งนี้เป็นอันล่าสุดครับอัพเดทเมื่อ วันที่ 8 ของเดือนนี้ที่ผ่านมานี้เองครับ

- แบ่งตาม ความต้องการภาษาต่างๆที่กำลังรับสมัครงาน โดยในการจัดอันดับนี้เอามาจาก Craigs List ครับซึ่งข้อมูลตรงนี้น่าเชื่อถือมากครับแต่อาจจะไม่ทั่วโลกครับแต่เน้นหนักไปทางข้อมูลของ America มากกว่าครับซึ่งผลปรากฎออกมาว่าSQL มาแรงแซงเป็นที่ 1 ซะงั้นส่วน C นั้นก็ตกไปอยู่ที่สองแต่ว่า Java หลุดไปไกลเลยอยู่ที่ 4 ส่วน Visual Basic หลุดไปไกลเลยอยู่อันดับที่ 9 ที่ SQL มาเป็นที่หนึ่งน่าจะเป็นเพราะว่าอาจจะต้องการ SQL developer มาทำงานเพื่อเตรียมข้อมูลเพื่อจะมาทำ BI ซึ่งในไทยที่ในตามธนาคารต่างๆ ก็มี SQL developer เพื่อดึงข้อมูลมาเพื่อเตรียมไว้สำหรับส่งแบงค์ชาติ ดังนั้นจึงไม่น่าแปลกใจว่า SQL Developer นั้นเป็นที่ต้องการมากในอเมริกา

- แบ่งตามหนังสือที่มีอยู่ใน amazon คราวนี้มาลุ้นกันต่อว่าภาษาใดจะครองอันดับหนึ่ง ซึ่งอันดับหนึ่งได้แก่
คราวนี้หนังสือของภาษา C มีมากที่สุดตามมาด้วย Java และ Visual Basic ตามมาติดๆ

- แบ่งตาม open source projects โดยเราจะใช้เว็บ Freshmeat เป็นตัวจัดอันดับซึ่งสามารถเข้าไปดูข้อมูลได้ที่นี่ http://freshmeat.net/browse/160 ซึ่งคราวนี้ C ก็ครองอันดับหนึ่งอีก (โหดูท่าภาษา C นี้จะครองบัลลังค์แชมป์นะนี่) และตามด้วยอันดับอื่นๆดัง chartแต่ไม่ยักกะรู้ว่า VB มี project ที่เป็น open source projects

- คราวนี้แบ่งตาม code ที่มี example code อยู่ใน googlecode โดยสามารถเข้าไปเล่นเจ้าตัว googlecode ได้ดังนี้ http://www.google.com/codesearch
อันนี้อาจะเชื่อไม่ค่อยได้เท่าไรเพราะว่า code ที่มีอยู่ใน googlecode นั้นยังน้อยอยู่

- คราวนี้แบ่งตาม Social Bookmark ซึ่ง Social Bookmark ที่จะใช้นี้เป็นที่รู้จักกันดีคือ Del.icio.us นั่นเองโดยจะได้ผลยังไงนั้นดูตาม chart เลย
โดย chart นี้น่าจะเป็นกลางมากที่สุดนั้นก็ เพราะว่าถ้าใครชอบอะไรภาษาไหน หรือเจออะไรที่เกี่ยวข้องกับภาษาที่ชอบ ก็จะเก็บ bookmark ตามความชอบของตนเองแต่ถ้าซึ่งถ้าสิ่งไหนไม่ชอบคงจะไม่ book mark ไว้ซึ่งผลก็ออกมาว่า JavaScript ครองที่หนึ่ง PHP ตามมาที่สองและ Java ตามมาลำดับส่วน VB อันดับเกือบโหล่ๆ

ผลสรุป
จาก ทุกๆ chart ที่เห็นจะได้ว่าภาษาที่ได้รับความนิยมสูงสุดนั้นก็คือ C แต่ก็ต้องยอมให้เค้าจริงๆเพราะว่าได้อันดับหนึ่งเกือบทุก chart รองลงมาก็เป็น Java และที่สามก็เป็นภาษายอดนิยมของคนทำเว็บ PHP ดังจะเห็นได้จากสรุปดัง chart ด้านล่าง
ไม่รู้ว่าจะตรงใจทุกๆ คนหรือเปล่าแต่ที่ผมรู้แน่ๆ C ยังไม่ตาย

ฺBusiness Activity Monitoring (BAM) On SOA

ฺBusiness Activity Monitoring (BAM)
เทคนิคที่ BAM(Business Activity Monitoring) ใช้ในการ monitoring ข้อมูลที่วิ่งอยู่บน SOA architecture ให้สามารถดูข้อมูลได้เกือบ real time นั่นคือการใช้วิธีที่เรียกว่า "Sensors" ซึ่งจะมาแทนการใช้ query event ด้วย sql statement แบบเก่า
ที่ใช้ resource จำนวนมาก และทำให้เิกิดปัญหา buttom nect ตามมา
BAM ถูกออกแบบมาเพื่อให้สามารถ analytics และ reporting ใกล้เคียง real-time มากที่สุด
BAM มีองค์ประกอบอยู่ด้วยกัน หก ส่วน ดังนี้
- Data Integration
- Data Caching
- Analytics
- Monitoring
- Alerting
- Reporting
ไว้โอกาสหน้าเราจะมาพูดถึง องค์ประกอบแต่ละส่วนของ BAM กันต่อนะึครับ

วิธีการเรียกใช้ EJB บน Websphrere Application Server

โดยปกติทั่วไปเวลาเรา call ejb จะใช้ตามตัวอย่าง เช่น
1 Context ic = new InitialContext();
2 Object o = ic.lookup("sample/User1LocalHome"); // sample/User1LocalHome คือ ชื่อ JNDI ejb
......................................

แต่เมื่อผมลองกับ Websphere Server 6.0 แล้วปรากฎว่าจะขึ้น error NameException ซึ่งหมายถึงการหา naming ของ
ejb ไม่พบ
ดังนั้นผมจึงเปลี่ยนมาใช้โค๊ดดังนี้ครับ
1 Context ic = new InitialContext();
2 Object o = ic.lookup("local:ejb/sample/User1LocalHome"); // โดยการเติม local:ejb ไว้ข้างหน้า JNDI ของ ejb
ผมก้อสามารถ เรียกใช้ ejb ที่ผมต้องการโดยไม่เกิดปัญหาในการหาชื่อ JNDI ไม่พบ อีกเลย

Friday 16 November 2007

[ถามต้อม#1] วิธีแก้ปัญหา OUI Error: "Java RunTime Environment was not found" ระหว่างการติดตั้ง Oracle

ถาม
สวัสดีครับขอรบกวนถามเรื่องการ install oracle database 11g นะครับ

พอดีลงแล้วมีการแจ้ง error ดังรูปครับhttp://i22.photobucket.com/albums/b332/toncrub/error.jpg

ในเครื่องผมลง jdk6 update3 ไว้แล้วครับเลยงงๆ ไม่รู้ว่าต้องแก้ตรงไหน


ตอบ

ปัญหานี้เป็นได้กับแทบทุก products ของ Oracle ครับ

ไม่จำเป็นว่าจะเกิดกับ Oracle Database 11g บน Windows เท่านั้น

วิธีแก้ปัญหาอย่างง่าย ๆ ก็ ...

ให้ลอง run command ตามนี้แทนการ double click ที่ file setup.exe ครับ

[ORACLE_INSTALLER_PATH]\setup.exe -ignoreSysPrereqs -jreLoc [J]
C:\oracle\db11106\oui\bin\setup.exe -ignoreSysPrereqs -jreLoc C:\java\jdk1.6.0_02


ให้เปลี่ยน path จาก C:\oracle\db11106\oui\bin\ เป็น pa

Tuesday 13 November 2007

IBM ยื่นซื้อ Cognos ห้าพันล้านเหรียญ US

เมื่อวานนี้ (12 พฤศจิกายน) IBM ยื่นซื้อ Cognos ด้วยราคา 58 เหรียญต่อหุ้น เบ็ดเสร็จเป็นจำนวนเงินทั้งสิ้นเฉียดห้าพันล้านเหรียญ US

ตลาด BI ช่วงนี้ร้อนระอุ

  • 3 เดือนก่อน Oracle ซื้อ Hyperion
  • เดือนที่แล้ว SAP ซื้อ BO
  • เมื่อวานนี้ IBM เสนอซื้อ Cognos
Cognos เป็นที่หมายตาของบริษัทยักษ์ใหญ่หลายเจ้า รวมทั้ง Oracle ด้วย แต่พักหลัง Oracle แผ่วลงไป เพราะได้ซื้อทั้ง Siebel และ Hyperion มาครอบครองแล้ว

รายละเอียดการซื้อขายครั้งนี้ ตามไปดูได้ที่

Monday 12 November 2007

ฐานข้อมูล ออราเคิล 11g (Oracle Database 11g) ออกครบทุก platform ให้ download แล้ว

Oracle Database 11g ออกครบทุก platform แล้วครับ

ตามไป download ได้เลยครับ

คอลัมน์ "ถามต้อม?"

ได้ฤกษ์งามยามดี จับยามสามตา เปิดคอลัมน์ใหม่ใน blog นี้แล้วครับ ชื่อว่าคอลัมน์ "ถามต้อม?"


"ถามต้อม?" คืออะไร?
ตรงไปตรงมา "ถามต้อม?" มาจาก "AskTom" ของ Oracle ครับ
เราเลียนแบบมาอย่างหน้าไม่อาย จาก "Tom" กลายเป็น "ต้อม"
จะตั้งชื่อคอลัมน์ว่า "ถามตอบ" ก็ไม่โดน เอาเป็น "ถามต้อม?" ดีกว่าครับ

แล้วใครคือ "Tom"?
Tom ชื่อเต็ม ๆ ว่า Tom Kyte เป็นกูรูอันดับหนึ่งของ Oracle ครับ
ทำงานกับ Oracle มาร่วม 15 ปี ปัจจุบันดำรงตำแหน่ง Vice President ของ Oracle Core Technolgy Group
และเป็นผู้เขียนคอลัมน์ AskTom ในนิตยสาร Oracle Magazine's และ website AskTom.oracle.com
อีกทั้งยังเป็นผู้เขียนตำราชือว่า "Effective Oracle by Design" ที่ขายดีเป็นเทน้ำเทท่า

แล้วใครคือ "ต้อม"?
"ต้อม" ไม่ใช่ใครอื่นไกล ก็คือบรรดาผู้เขียนของ blog แห่งนี้ครับ
ที่จะมาให้คำตอบตามความถนัดของแต่ละคน
บางครั้งจะเห็นพวกเรา "ถามเองตอบเอง" ก็ไม่ต้องแปลกใจครับ
เพราะชีวิตการทำงานของพวกเรา เจอปัญหากับ Oracle และ Java ตลอดเวลา
ทุกครั้งที่เราติดปัญหาอะไร ก็จะมา post ถามไว้ในนี้เช่นกัน
เพื่อให้นักเขียนท่านอื่น ๆ หรือตัวเราเองในอนาคตมาตอบครับ
ก็ถือว่าเป็นการ share ประสบการณ์ให้ผู้อ่าน blog ไปในตัวด้วย
(ผู้อ่าน blog จะมาช่วยตอบก็ยินดี จากถามต้อม กลายเป็นต้อมถาม ฮา)

ถามอะไร "ต้อม" ได้บ้าง?
คำถามที่เกี่ยวข้องกับ Oracle และ Java ครับ

ทุกคำถามจะได้รับคำตอบหรือไม่?
ไม่ครับ เราจะตอบเฉพาะคำถามที่เราอยากตอบ และตอบได้ครับ

จะถาม "ต้อม" ได้อย่างไร?
สามารถถามได้โดยการ post คำถามไว้ใน comment post ถามต้อม
เราเปิดช่องทางให้ใคร ๆ (anonymous) ก็ถามได้
แต่เราจะกระตือรือร้นกว่า ถ้าผู้ถามแสดงตัวด้วย ว่าเป็นใครมาจากไหน

อีกช่องทางหนึ่งที่สามารถส่งคำถามมาได้ ก็คือทาง email
tom@middleware.co.th
สำหรับกรณีที่มี log file หรือ screenshot

"ถามต้อม?" ถือเป็น forum หรือไม่?
ไม่ครับ คอลัมน์นี้ไม่ใช่ forum ถ้าจะใช้งาน forum ด้าน Oracle และ Java
ให้ไปที่ narisa ครับ มีกูรูเก่ง ๆ หลาย ๆ คนแวะเวียนมาช่วยตอบครับ

Thursday 8 November 2007

Oracle Database Backup with RMAN

เรื่องราวในตอนนี้จะเกี่ยวกับการ Backup Oracle database แบบ physical backup โดยจะใช้ utility ที่ชื่อว่า Recovery Manager (RMAN)

ศัพท์ที่เกี่ยวข้องเกี่ยวกับการ backup

    การ backup มีโดยหลักๆแล้วมี 2 แบบ
  • Backup database ทั้งก้อน
  • Backup แค่เฉพาะบางส่วนของ database เช่น backup เฉพาะบาง tablespace หรือบาง datafile
    ประเภทการ backup
  • Full backup คือทุกครั้งที่ทำการ backup จะสร้าง backup ด้วยข้อมูลใหม่ทั้งหมด
  • Incrememtal backupคือ backup เฉพาะข้อมูลส่วนที่ต่าง ส่วนที่มีการเปลี่ยนแปลง แต่แบบนี้จะต้องมี backup ตัวเก่าอยู่ก่อนด้วยเพื่อเอาไว้เปรียบเทียบว่ามันต่างกันตรงไหน
    Mode การ backup
  • Offline backup อาจเรียกว่า consistent backup คือการ backup ขณะที่ database ไม่ได้ถูกทำงาน
  • Online backup อาจเรียกว่า inconsistent backup หรือ hot backup คือการ backup ขณะที่ database กำลังทำงานอยู่
    Format ของการ backup
  • Image Copies รูปแบบนี้จะเหมือนกับการ copy physical file ระดับ os เช่น data file ต้นฉบับมีขนาดเท่าไหร่ backup ก็จะมีขนาดเท่ากัน ข้อเสียของการ backup ในรูปแบบนี้คือเปลืองเนื้อที่
  • Backup set รูปแบบนี้เป็น format ของ Oracle โดยเฉพาะ Oracle เลือก backup set รุปแบบนี้เป็น default backup set แตกต่างกับ image copies ตรงที่จะ backup เฉพาะ block ที่มีข้อมูลจัดเก็บอยู่เท่านั้น โดย backup set นั้นเราสามารถกำหนดระดับ set ได้ และกำหนดได้อีกว่าจะเก็บลง media ชนิดไหน disk หรือ tape
Recovery Manager (RMAN)
RMAN คือ utility ที่ถูกติดตั้งมาพร้อมกับ Oracle Database มีไว้เพื่อทำหน้าที่ จัดการ backup, restoring และ recovering database โดยสามารถสั่งงานผ่าน Command หรือ OEM ก็ได้

    ศัพท์ที่เกี่ยวข้องกับ RMAN
  • Target Database คือ database เป้าหมายที่เราจะทำการ backup
  • Channel Process คือ ช่องทางที่ RMAN จะติดต่อกับ target database
  • RMAN Repository คือ ที่เก็บข้อมูลของ RMAN โดยจะเก็บรายละเอียดของการ backup ของ instance นั้นๆ ซึ่งโดย default จะเก็บข้อมูลอยู่ control file ของ instance นั้นๆ แต่เราสามารถเปลี่ยนได้โดยการสร้าง database ใหม่ขึ้นมาเพื่อให้เก็บรายละเอียดการ backup แล้วเราอาจกำหนดให้ share ได้นั้นคือถ้ามี database ที่จะ backup หลายตัวก็ใช้ RMAN Repository เดียวกันได้
  • flash recovery area คือตำแหน่งที่ instance นั้นๆ ใช้จัดการกับไฟล์ต่างๆที่เกี่ยวกับการ backup เช่น archive log file โดย default path จะเก็บอยู่ทีนี่ หรือ ไฟล์ที่ได้จากคำสั่ง RMAN
  • Media managent software คืออุปกรณ์ต่างๆที่ใช้เพื่อ backup ข้อมูล เช่น tape drives การจะใช้อุปกรณ์ภายนอกต่างๆ วิธีใช้ขึ้นอยู่กับผู้ผลิตเป็นผู้กำหนด
  • Recovery catalog คือ database ที่เก็บ recovery catalog schema ซึ่งจะเก็บ metadata ที่ RMAN ใช้ทำหน้าที่ backup และ recovery
    Parameter ที่ใช้ในการ configure RMAN
  • DB_RECOVERY_FILE_DEST_SIZE ใช้กำหนดขนาดพื้นที่ของ flash_recovery ให้ใช้ได้เท่าไหร่
  • DB_RECOVERY_FILE_DEST ใช้กำหนด path ที่ใช้จัดเก็บ backup set
    View ที่เกี่ยวข้องกับ RMAN
  • V$RECOVERY_FILE_DEST เป็น view ที่บอกดูตำแหน่งของ flash recovery
  • V$FLASH_RECOVERY_AREA_USAGE เป็น view ที่บอกตำแหน่ง file แต่ละประเภทใช้เนื้อที่ไปเท่าไหร่
    Physical File ที่ RMAN สามารถ backup ได้
  • Database file = { data file, control file, spfile }
  • Archived log file
  • ส่วน password file, network configure file (tnsname.ora, listener.ora, sqlnet.ora) ไม่สามารถใช้ RMAN backup ได้ พวกนี้เรา manual backup เองได้
คำสั่ง RMAN เบื้องต้น
Start & Exit RMAN
# RMAN target /[@] [nocatalog | catalogname]
# RMAN
RMAN> EXIT

คำสั่ง run script RMAN จากไฟล์
# RMAN target / @file1
RMAN> @file1

คำสั่งตรวจสอบ syntax RMAN
# RMAN CHECKSYNTAX
# RMAN CHECKSYNTAX @file1

คำสั่งเกี่ยวกับ parameter
RMAN> show ;
RMAN> SHOW ALL;
RMAN> CONFIGURE CLEAR;

คำสั่งเกี่ยวกับการจัดการ device อื่น
ระบุอุปกรณ์ที่จะจัดเก็บ
RMAN> CONFIGURE DEFAULT DEVICE TYPE TO ;
ระบุประเภทของการ backup และจะบีบอัดหรือไม่
RMAN> CONFIGURE DEVICE TYPE BACKUP TYPE TO ;
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT ‘/backup/ora_df%t_s%s_s%p’;
บาง media managers ต้องปรับแต่งผ่าน parameter แล้วแต่ผู้ผลิตอุปกรณ์นั้น
RMAN> CONFIGURE CHANNEL DEVICE TYPE SBT PARMS=’ENV=mml_env_settings’;

คำสั่งเกี่ยวกับการ backup data file
RMAN> BACKUP DATABASE;
Backup บาง tablespace
RMAN> BACKUP TABLESPACE system, users, tools;
RMAN> BACKUP DEVICE TYPE sbt MAXSIZE=10M TABLESPACE user, tool;
Backup บาง data file
RMAN> BACKUP DEVICE TYPE sbt DATAFILE 1,2,3,4 DATAFILECOPY ‘/tmp/system.dbf’;
RMAN> BACKUP DEVICE TYPE sbt TABLESPACE user INCLUDE CURRENT CONTROLFILE;
RMAN> BACKUP AS BACKUPSET DATAFILE
’ORACLE_HOME/oradata/trgt/users01.dbf’,
’ORACLE_HOME/oradata/trgt/tools01.dbf’;
เราสามารถกำหนดเรื่องของ incremental backup ได้แต่การทำ incremental backup จะต้องเปรียบเสมือน level 1 ดังนั้นก่อนจะทำได้ต้องมี level 0 ก่อน นั่นคือเมื่อเรา backup ครั้งแรกให้กำหนดเป็น level 0 ก่อน แต่เมื่อทำ incremental backup ไฟล์ backup level0 และ 1 ต้องอยู่ครบเพื่อทำให้สามารถทำการ restore และ recovery ได้อย่างสมบูรณ์
RMAN> BACKUP INCREMENTAL LEVEL [0 | 1] CUMULATIVE DATABASE;

คำสั่งเกี่ยวกับ backup control file
เป็นการ config ว่าจะให้ autobackup control file และ parameter file เมื่อมีการเปลี่ยนแปลงหรือไม่ และเมื่อมีความเสียหาย RMAN จะ recover ให้กับ instance นั้นเอง
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ;
เปลี่ยน default name ของ autobackup
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE to ‘?/oradata/cf_%F’;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE clear;
ถ้าต้องการ override ค่า autobackup เฉพาะ session นั้นๆ (ใช้ใน run block กับ RMAN prompt)
RMAN> SET CONFIGURE AUTOBACKUP FORMAT
Backup copy control file ณ ปัจจุบัน
RMAN> BACKUP CURRENT CONTROLFILE;
RMAN> BACKUP CURRENT CONTROLFILE TO ’/backup/curr_cf.copy’;
Backup copy control file
RMAN> BACKUP AS COPY CURRENT CONTROLFILE FORMAT ‘/tmp/control01.ctl’;
RMAN> BACKUP DEVICE TYPE sbt CONTROLFILECOPY ‘/tmp/control01.ctl’;

คำสั่งเกี่ยวกับ backup parameter file
RMAN> BACKUP SPFILE;
RMAN> BACKUP DEVICE TYPE sbt SPFILE;

คำสั่งเกี่ยวกับ backup archived log file
RMAN> BACKUP ARCHIVELOG …;
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
RMAN> BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT;
RMAN> BACKUP ARCHIVELOG COMPLETION TIME BETWEEN ’SYSDATE-31’ AND ’SYSDATE-7’;

คำสั่ง restore
RMAN> RESTORE DATABASE;
RMAN> RESTORE TABLESPACE users;
RMAN> RESTORE DATAFILE <ชื่อ datafile>;
RMAN> RESTORE DATAFILE 7;

คำสั่ง recovery
RMAN> RECOVER DATABASE;
RMAN> RECOVER TABLESPACE users;
RMAN> RECOVER DATAFILE <ชื่อ datafile>;
RMAN> RECOVER DATAFILE 7;

ตัวอย่างการ backup
Backup Database รวมทั้ง Archivelog file พร้อมให้ delete archive log file ที่ backup แล้วด้วย
# RMAN TARGET backup_admin/backup_admin NOCATALOG
RMAN> BACKUP DATABASE PLUS ARCHIVELOG DELETE INPUT;

Backup Database รวมทั้ง Control file พร้อมทั้งให้ delete ไฟล์ backup ที่ล้าหลังด้วย
RMAN> backup incremental level 0 cumulative device type disk tag '%TAG' database include current controlfile;
RMAN> allocate channel for maintenance type disk;
RMAN> delete noprompt obsolete device type disk;
RMAN> release channel;

ตัวอย่างการ restore & recovery
Recovering ทั้ง database
RMAN> STARTUP FORCE MOUNT;
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;

Recovering เฉพาะบาง tablespace
RMAN> SQL 'ALTER TABLESPACE users OFFLINE';
RMAN> RESTORE TABLESPACE users;
RMAN> RECOVER TABLESPACE users;
RMAN> SQL 'ALTER TABLESPACE users ONLINE';

Recovering Datafiles 7
RMAN> SQL 'ALTER DATABASE DATAFILE 7 OFFLINE';
RMAN> RESTORE DATAFILE 7;
RMAN> RECOVER DATAFILE 7;
RMAN> SQL 'ALTER DATABASE DATAFILE 7 ONLINE';

การทำ Backup Control File to Trace
ทำ Trace ของ Control File เพื่อใช้ในการ recover เมื่อ control file เสียหาย ถ้าใช้ OEM ให้เข้าเมนุ Controlfiles แล้วกดปุ่ม Backup To Trace หรือใช้คำสั่ง
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE; โดยผลลัพธ์จะเก็บอยู่ตามที่ระบุไว้ใน parameter USER_DUMP_DEST
โดย default name: _ora_pid.trc
และ default path: อยู่ที่ <ORACLE_HOME>/admin/<sid>/udump
ภายใน trace ไฟล์จะเก็บเป็นคำสั่ง sql สามารถนำไปสร้างเป็น control file ใหม่ได้
Note: แนะนำว่าเพื่อให้ไม่เกิดความสับสนในการหา file trace ก่อนสั่ง trace เข้าไปลบไฟล์ trace เก่าๆที่เก็บอยู่ก่อนแล้วค่อยสั่ง trace controlfile

เราสามารถทำ Job RMAN โดยใช้ OEM ช่วยทำได้เหมือนกัน แต่เอาไว้ก่อนถ้าไม่ขี้เกียจเดี๋ยวเขียนต่อ แล้วเมื่อวันก่อนลองเล่น Oracle Database 11g เห็นมี feature น่าสนใจอยู่หลายตัวถ้ามีเวลาอยากมา review ให้ดูกัน
ปล1. พยายามสรุปให้ตอนนี้สั้นๆกระชับ ไม่เขียนยาวเหมือนตอนที่แล้ว เขียนยาวเดี๋ยวคนอ่านเหนื่อย คนเขียนก็เหนื่อยเหมือนกันครับ
ปล2. ตอนหน้าลองมาทำ recovery physical database เมื่อมันเสียหายกัน

Tuesday 6 November 2007

Crack password Oracle database ตั้งแต่ 8i ถึง 11g

คงเป็นที่ทราบกันดีว่า password ที่เราเก็บไว้ในฐานข้อมูลเพื่อไว้ใช้ในการทำ authentication (ระบุตัวตน) นั้นในปกติการเก็บ password นั้นเราจะไม่เก็บกันตรง ๆ เช่นเราตั้ง password ว่า siam เวลาเก็บลงใน database จริงแล้วจะไม่เก็บคำว่า siam โดยคำว่า siam นั้นจะถูกแปลงเป็นคำอื่น ๆ โดยจะไม่เหลือเค้าโครงเดิมเลย โดยการแปลงนี้ก็มี algorithm (วิธีการ) ต่าง ๆ มากมายกันไปซึ่งเราจะเรียกวิธีการนี้ว่า การ hash password แต่ว่ามันอาจจะยังไม่เพียงพอ ทำให้บางคนนั้นก็ได้เพิ่ม keyword เข้าไปผสมลงใน password ก่อนจะผ่านกรรมวิธีการ hash password เพื่อให้แก้ไขได้ยากยิ่งขึ้นซึ่งเราเรียก keyword ที่เราไปผสม password นี้ว่า salt (ซึ่งเป็นตัวเดียวกันกับคำว่า เกลือ ครับ ก็เหมือนเวลาที่เรากินอาหารแล้วอยากให้อาหารอร่อยขึ้นเราก็เหยาะเกลือลงไป แต่ในที่นี้เพื่อที่จะทำให้การถอด password ยากขึ้น)

ซึ่งวิธีการนี้อาจะนำไปใช้ร่วมกับข้อมูลที่ป็นความลับ เพื่อทำการเข้ารหัส เพื่อไม่ให้คนอื่นที่สามารถทะลุทะลวงล้วงเข้ามาในฐานข้อมูลของเรา นั้นอ่านข้อมูลนี้ได้ ถึงได้ข้อมูลมาอาจจะต้องมานั่งเสียเวลาในการแก้ algorithm ตัวนี้มากขึ้น แต่ไม่น่าเชื่อว่าเจ้าแห่ง database อย่าง Oracle นั้น password ที่ถูกทำการ hash ไว้แล้วนั้นจะถูกแก้ออกมาได้อย่างง่ายดายและที่สำคัญไม่ใช่มีแค่ tool เดียวเท่านั้นที่สามารถแก้ได้ซึ่งแสดงออกมาดังตารางด้านล่างดังนี้

จะเห็นได้ว่าโปรแกรมที่ชื่อ worrauthbf version 0.2 นั้นใช้เวลาแค่ 3s วินาทีเท่านั้นเอง แต่ว่าที่เร็วกว่านั้นก็เพราะใช้ CPU ประมวลผลแบบ Dualcore แต่ถ้าเป็นแบบที่ไม่ใช่ CPU ที่เป็นแบบ Dualcore หละก็ orabf 0.7.6 จะเร็วกว่าครับ แต่ว่า password ที่ crack ได้เร็วนั้นขึ้นอยู่กับว่าจำนวน password นั้นยาวหรือสั้นมากแค่ไหนด้วยครับ ซึ่งถ้าใครอยากลองว่าจะ crack ได้จริงหรือเปล่าลองไปโหลดโปรแกรมที่เว็บนี้เลยครับ

ซึ่งเจ้าตัวนั้นไม่ห่วง source code ด้วยครับสามารถนำไปศึกษาได้ด้วยครับแต่เสียอย่างเดียวเป็นภาษา C ไม่ใช่ภาษา Java

เอาหละโม้มามากแล้วลงมือทำกันจริงๆ กันดีกว่าเดี๋ยวจะหาว่าผมมาโม้อีกโดน schema ที่ผมจะเอามาลองนั้นคือ schema HR โดยผมจะเปลี่ยน password เป็น “HRACLE” ตัวใหญ่หมดครับและ database ที่ลองคือ Oracle 11g R1 ครับโดยตอนแรกนั้นให้เราไปติดตั้งโปรแกรม worrauthbf version 0.2 ลงในเครื่องก่อนครับหลังจากนั้นก็ไปทำตามขึ้นตอนนี้ครับ
  • เตรียมข้อมูลเพื่อที่จะทำการถอด password ที่ทำการ hash แล้วให้กลับมาเป็น password ปกติโดยให้เรา login เข้าไปใน database ก่อนโดยเราต้องมีสิทธิ์เป็น admin ด้วยนะครับไม่งั้นดึงข้อมูลไม่ได้ โดยเราต้องใช้ข้อมูลตามรูปแบบดังนี้ครับ

    username:password hash:11g password hash:sid:server:

    username :: นั้นเป็นชื่อของ username ที่เราต้องการจะแก้ hash password ครับ
    password hash :: อันนี้คือ password ที่ถูกทำการ hash แล้วครับ
    11g password hash :: ที่นี้ก็คือ salt ที่ผมบอกนั้นเองครับโดย salt ตัวนี้จะไม่ซ้ำกันตามแต่ที่ระบบจะสร้างขึ้นมา
    sid :: คือชื่อของ Oracle database instance เช่น orcl
    server :: นั้นเป็นชื่อของ server ที่ database นั้นอยู่ครับ
    หมายเหตุ ในแต่ละ version ของ database นั้นอาจจะต้องการ parameter ที่แตกต่างกันเพื่อที่จะใช้เป็นข้อมูลที่จะทำการแก้ hash password ครับโดย salt นี้ Oracle เพิ่งจะมาเริ่มมีใน Oracle database 11g ครับ

    แต่ว่าโชคดีครับที่เราไม่ต้องไปหา parameter เหล่านี้เองให้เราใช้คำสั่ง sql นี้ครับแต่ต้องอย่าลืมว่าต้อง login เป็น username ที่มีสิทธิ์เป็น admin ครับ ดังนี้

    select u.name||':'||u.password||':'||substr(u.spare4,3,63)||':'||d.name||':'||
    sys_context('USERENV','SERVER_HOST')||':'
    from sys.user$ u, sys.V_$DATABASE d
    where u.type#=1;

    ซึ่งเมื่อ run ใน database ที่ผมทดสอบผลที่ได้คือ

    HR:E313D0596944C41D:6E7036A1EB587DCCE6D84DFF73E6F80207BB8F980B5643D01AE23F747FAC:ORCL:vista:

  • หลังจากนั้นก็จะใช้ command prompt run โปรแกรมเพื่อที่จะทำการ crack hash password ตามขั้นตอนนี้ครับ

      เข้าไปใน home directory ที่เราติดตั้ง worrauthbf version 0.2 ไว้
      run คำสั่ง woraauthbf แล้วตามด้วย parameter ต่างๆ ดังนี้
        -p :: คือชื่อ file ที่เก็บข้อมูลที่เราเตรียมไว้ข้างต้นซึ่งในที่นี้คือ 11gHash.txt
        -t :: ในที่นี้คือเป็นการระบุว่า hash password ที่เราต้องต้องการแก้นั้นเป็น version อะไรในที่นี้ให้ระบุว่า 11g10g
        -c :: เป็นการระบุว่า password ที่เราจะแก้ hash password นั้นมี character ชนิดใดบ้างซึ่งแบ่งได้เป็น สามชนิดคือ
          "alpha" คือ [A-Z]
          "alphanum" คือ [A-Z0-9]
          "all" คือ [A-Z0-9!@#$%^&*()-_+=~`[]{}|\:;"'<>,.?/]

          ซึ่งให้เราเลือกว่าทดลองตามความเหมาะสมครับถ้าสมมติเรารู้ว่า password เรามีแค่ตัวอักษรและตัวอักษรปนกันก็ให้เลือก alphanum ส่วนในที่นี้เรารู้อยู่แล้วว่า password ของเรามีตัวอักษรอย่างเดียวก็เลือก alpha ครับ

        -m :: เป็นการระบุว่า password ของเรานั้นยาวเท่าไรครับ
        -d :: นั้นเป็นการระบุ dictionary file ครับซึ่งจะระบุหรือไม่ระบุก็ได้แต่ถ้าเราระบุมาก็จะทำให้แก้ hash password ได้เร็วขึ้นมากแต่ในที่นี้ผมไม่ใส่นะครับ

        ที่จริง parameter นั้นมากกว่านี้อีกซึ่งถ้าใครสนใจก็ลองข้าไปดูที่เว็บนี้ครับ

        http://soonerorlater.hu/index.khtml?article_id=513

เอาหละที่นี้เราลองมาดูผลลัพธ์กันเลย


หมายเหตุ คือผมลองแก้ hash password หลายตัวพร้อมกันครับผลที่ได้กว่าจะแก้ได้แต่ละตัวช้ามากครับ

สรุป

ถ้าไม่มี dictionary file ช้ามากถึงมากที่สุด

ใช้กับ password ที่เป็นตัวใหญ่ได้อย่างเดียวนั้นก็คือถ้าเป็น 11g แล้วตั้ง password case sensitive หละก็จะแก้ไม่ได้ดังนั้นถึงจะบอกว่ารองรับ 11g แต่ก็ไม่เต็มร้อยครับต้องรอ version ใหม่ดีกว่า

ความยาวของ password รองรับแค่ 10 ตัวอักษรเท่านั้นถือว่าน้อยมากซึ่งตอนนี้มีตัว crack hash password ของ database Oracle ออก version ใหม่มาคือ checkpwd ซึ่งผมก็ยังไม่ได้ลองครับลองไปเล่นดูตามนี้เลยครับ http://www.red-database-security.com/software/checkpwd200a12.zip

อ้างอิง
http://www.petefinnigan.com/weblog/archives/00001103.htm
http://soonerorlater.hu/index.khtml?article_id=513

Oracle OpenWorld Presentation Downloads

วันที่ 11 -15 นี้ ที่ San Fran จะจัดงาน Oracle OpenWorld
เป็นงานที่แสดง Oracle Technology ที่ยิ่งใหญที่สุดในรอบปี
ปกติงาน OpenWord จะจัดปีละ 3 ครั้ง โดยจะเวียนไปตามทวีปต่าง ๆ ของโลก
ตลอดปี 2007 จะมีที่

  • เซา เปาโล ประเทศบราซิล เมื่อมีนาที่ผ่านมา
  • เซี่ยงไฮ้ ประเทศจีน เมื่อ 3 เดือนก่อน
  • ที่กำลังจะถึง ก็ San Fran สัปดาห์หน้า
จะมีบรรดา กูรู ทั้งหลายมากเป็น speaker ตลอด 5 วันเต็ม
ทุก ๆ ครั้งหลังจากที่งานจบลง Oracle ก็จะเปิดให้ download presentations + materials ต่าง ๆ ได้ฟรี
สำหรับใครที่สนใจ วันนี้ผมมี OpenWorld Presentation ให้ download ไม่ต่ำกว่า 100 files มาฝากครับ
เป็นของ OpenWorld ที่ เซี่ยงไฮ้ เนื้อหาใหม่มาก ๆ ครับ

Monday 5 November 2007

ภูมิหลังของ Web Application

ในยุคแรกของการติดต่อสื่อสารผ่านเวบจะเป็นแข็งๆถื่อๆตรงไปตรงมา หรือที่เรียกว่า Static Content คือ เนื้อหาข้อมูลจะคงที่ ไม่สามารถเปลี่ยนแปลงได้ พอซักระยะนึงก็มีคนพัฒนา CGI (Common Gateway Interface) Script ใน Web Server ได้ นี่แหล๊ะที่ทำให้เกิด Dynamic Content ขึ้น เจ้า CGI นี้เจ๋งมาก มันยัง support ภาษาอื่นๆ ด้วย เช่น ภาษา C หรือ C++ ทำให้ขณะนั้น CGI เป็นที่ popular มาก จนตอนนี้ก็ยังใช้อยู่เลย

ต่อมา Sun ผู้ผลิตภาษา Java ได้คิดทำ Java Applet ขึ้น แต่จะเป็นการทำงานที่อยู่ฝั่ง Client Side ระหว่างนั้นเอง Sun ก็ได้เริ่มออก Technology ใหม่อีกที่ชื่อว่า Servlet เพื่อมาทำงานฝั่ง Server Side เจ้า Servlet ได้ช่วยแก้ไขปัญหาข้อเสียหลายอย่างของ CGI เช่น ในเรื่องของประสิทธิภาพและความยืดหยุ่น ทำให้เจ้า Servlet ดังขึ้นมาในพริบตา

หลังจากนั้นไม่นาน พี่ Sun เค้าก็สร้าง Technology ใหม่อีกแหละ คือเจ้า JSP ตัวนี้เจ๋งมาก จริงๆมันออกมาก็เพื่อแก้ปัญหาของ Servlet อีกหละ แทนที่เราจะเขียน Code ทั้งหมดเอาไว้ที่ Servlet กว่าจะเขียน Web ออกมาได้ซักหน้าก็คงนาน เค้าก็เลยแยกออกมาเป็นภาษา Script ออกมาช่วยให้การทำงานง่ายขึ้น แถมเวลาแก้ไขไฟล์ JSP ก็ไม่จำเป็นต้อง Compile ใหม่อีก เจ้าตัว Servlet Container จะจัดการ Compile ให้เองอัตโนมัติ

เวลาผ่านไป คนทำงานเขียนโปรแกรมก็เริ่มฉลาดขึ้น ทำโปรเจคใหญ่ก็มามากต่อมาก ทำให้เรียนรู้ปัญหาที่เกิดขึ้นระหว่างการทำงาน จากประสบการณ์ที่สั่งสมมาทำให้เกิดสิ่งที่เรียกว่า Framework ขึ้น นิยามสั้นๆของ Framework นะครับ Frame แปลว่ากรอบ work แปลว่า การทำงาน แปลจากหลังมาหน้าได้ความว่า การทำงานที่เป็นไปตามกรอบ หรือแบบแผนนั้นเองครับ การที่เรามี Framework ก็เพื่อช่วยลดภาระการทำงานให้น้อยลง ไม่ต้องเสียเวลา ส่วน Framework ที่เราพอจะรู้จักในสาย Web ดังก็มี Spring Framework, Struts Framework … นับนิ้วคงไม่หมด แต่ที่จะพูดถัดจากนี้ไปจะเป็น Struts Framework กันครับ

Saturday 3 November 2007

สรุปประเด็นเรื่อง Oracle กับ BEA

post นี้ช้าไป 1 สัปดาห์ครับ จะสรุปประเด็นเรื่อง Oracle กับ BEA- Oracle ยื่นข้อเสนอ BEA 17 / หุ้น- BEA ปฏิเสธว่า 17 / หุ้น น้อยไป- Oracle ยื่นข้อเสนอว่า ยืนยันที่ราคานี้ และราคาจะมีผลถึงวันอาทิตย์ที่ 27 ที่ผ่านมาเท่านั้น- BEA เริ่มอ่อน บอกว่าถ้าได้ 21 ก็จะตกลง- Oracle ยืนยันข้อเสนอเดิม- สรุป ข้อเสนอนี้ expire ไปเรียบร้อย Oracle กับ BEA ยังไม่มีการซื้อขายแต่อย่างใดนักวิเคราะห์ออกมาบอกว่าการยื่นเสนอครั้งถัดไป BEA น่าจะได้ราคาที่ต่ำกว่าเดิม

Pagerank จาก 0 เป็น 6

สุดสัปดาห์นี้ ขอไม่ post เรื่อง technology ครับ, มาคุยกันสบาย ๆ ดีกว่า

ช่วงสัปดาห์นี้ บรรดา web/blog master ทั้งหลายคงจะทราบดีว่า google update ค่า pagerank แล้ว
ก็จะเห็นหลาย ๆ คนมีบ่นอุบอยู่เหมือนกัน ว่าทำไม pagerak ไม่ค่อยขยับเลย

ส่วนผมทำหน้าที่เป็น blog master แห่งนี้ พอจะถู ๆ ไถ ๆ บ้างเรื่อง google pagerank
แต่ไม่ค่อยจริงจังกับมันเท่าไหร่
blog นี้ก็เพิ่งจะทำมา 4 เดือน ค่า pagerak ขยับเป็น 1 ก็ดีใจตายแล้วครับ

แต่เกิดเรื่องมหัศจรรย์ขึ้นครับ
ได้ pagerank จาก 0 เป็น 6!

ผมเองยังแทบไม่เชื่อสายตาตัวเอง ต้องตามไปตรวจสอบหลาย ๆ ที่
ว่าเราได้ 6 จริง ๆ เหรอ?

เพราะผมเห็นอย่างหลาย ๆ web กว่าจะได้ 5-6 ก็ต้องหมั่นดูแลร่วม 2 ปีขึ้นไป

ดังนั้นผมจึงคุ้ยต่อ ว่าทำไมค่า pagerank เราดันขึ้นสูงจัง
ในที่สุดก็มาถึงบางอ้อ

สาเหตุสำคัญก็คือที่ blogs.oracle.com ที่เป็น official blog ของ oracle
มี link กลับมาหา blog ของเราแห่งนี้ครับ

ที่ blogs.oracle.com มี pagerank 8 เลยทำให้ blog เรามีค่าสูงตามไปด้วย

ก็จึงต้องขอบคุณ Mr. Justin Kestelyn, Senior Director ของ OTN
ที่ได้แปะ link ของเราไว้กับบรรดา oracle กูรูทั่วโลก ภูมิใจครับ

ในที่สุด link คุณภาพ มีน้ำหนักกับ pagerank ที่สุดครับ

Friday 2 November 2007

Oracle ฉีกนำ IBM ทางด้านความเป็นผู้นำทาง Technology ของ Data Warehouse


โดยในปีที่แล้วนั้น Gartner ได้ทำการสำรวจทางด้านความเป็นผู้นำทาง Technology ของ Data Warehouse (Leader) ซึ่ง Oracle นั้นอยู่ในอันดับที่ 3 โดยที่ Teradata และ IBM นั้นครองอันดับหนึ่งและอันดับสองตามลำดับโดย Oracle นั้นตามหลัง IBM อย่างหายใจลดต้นคอดังที่เห็นตามกราฟครับโดย Microsoft นั้นตามหลังมาอย่างห่าง ๆ

แต่ว่าผลสำรวจปีนี้ของ Gartner ออกมาแล้วปรากฏว่า Oracle นั้นได้แซง IBM ขึ้นมาแล้วและกำลังไล่กวด Teradata อย่างสนุกซึ่งโอกาสที่จะแซงนั้นอาจจะยากซักหน่อยเพราะว่าทาง Teradata นั้นเค้าเชี่ยวชาญทางด้านนี้มานานแล้วและพัฒนาทางด้าน Data Warehouse มาอย่างต่อเนื่องไม่เหมือนกับ Oracle ที่จับแต่ database จนกระทั่งเพิ่งมาจับทางด้าน Data Warehouse แต่ก็ไม่แน่อาจจะเหมือน Google ที่มาที่หลังแต่ดังกว่าก็ได้
ส่วนเรื่องทางส่วนแบ่งทางการตลาดของ Data Warehouse ของ Oracle นั้น Oracle ทิ้งห่างคู่แห่งไปไกลหลายขุมเลยทีเดียว โดยตรองส่วนแบ่งทางการตลาดทั้งหมด 41% ในปี 2006 นะครับแต่ปีนี้ยังไม่รู้ครับแต่ที่น่าแปลกทั้งๆ ที่ Teradata นั้นเป็นผู้นำทางด้านนี้กลับครองส่วนแบ่งทางการตลาดได้น้อยมาก

Oracle Database Uptime

Post นี้สั้น ๆ กระชับครับ
วันก่อนเข้าไปหาลูกค้า ได้รับคำถามว่า
เราจะรู้ได้อย่างไรว่า Oracle Database ที่ใช้งานอยู่ start มาตั้งแต่เมื่อไหร?

คำตอบ ให้ login ด้วย sys หรือ system แล้ว run query นี้ครับ

SELECT to_char(startup_time,'DD-MON-YYYY HH24:MI:SS') "DB Startup Time" FROM sys.v_$instance;

Thursday 1 November 2007

Oracle ADF Business Component (BC4J) ตอนที่ 5 สร้าง Client

ต่อจากคราวที่แล้ว ผมสัญญาว่าจะสร้างตัว Client ขึ้นมาติดต่อกับ Customers View Object กัน งั้้นไม่เสียเวลาเรามาลองทำการเลยครับโจทย์ที่ตั้งไว้คือ จะเลียนแบบกับ การสร้างตัว Client ที่ติดต่อกับ Entity Object โดยจะทำการหาข้อมูลชื่อลูกค้าที่มี Customers ID = 118 เพื่่อเปรียบเทียบความยากง่ายระหว่างการใช้ Entity ตรงๆ กับเรียกใช้ผ่าน View Object ขั้นตอนมีดังนี้

1. ในที่นี้เรานำโปรเจคเก่ามาใช้เลยนะครับ ซึ่งจะมี Application Moduel ชื่อ CustomersService และ View Object ชื่อ CustomersView เราจะต้องให้ Application Module รู้จััก View เสียก่อน โดยดับเบิ้ลคลิ๊กที่ CustomersService แล้วคลิ๊กที่ Data Model ให้เลือก CustomersView ไปทางขวา ตรงนี้จะเป็นการรวม CustomersView กับ CustomersService ครับ ตามรูป แล้วกด OK ครับ


2. พิจารณาที่ CustomersServiceImpl.java จะมี Code เพิ่มขึ้น ดังรูป
3. เนื่องจากเราต้องการดึงค่าข้อมูลจาก Customers View เป็น Record ดังนั้นเราต้องสร้าง Class Row ของ Customers View ด้วย ขั้นตอนก็ง่ายมากครับ ดับเบิ้ลคลิ๊ฏที่ Customers View จากนั้น คลิ๊กตรงแทบ Java คลิ๊กเลือก Generate Java File

4. ผมสร้าง Method findCustomersViewByPK คล้ายกับ Method findCustomersByPK ก่อนหน้านี้ครับ ดังรูป

5. เมื่อทำการรันโปรแกรมจะได้ผลดังรูป

บท​​​ความ​​​ที่​​​เกี่ยวข้อง

Wednesday 31 October 2007

Oracle Database Backup and Recovery Concept

เมื่อต้นเดือนที่ผ่านมาได้รับโจทย์ให้ไปดูแล Oracle Database ที่ไซต์ของลูกค้า และสิ่งที่ขาดไม่ได้ในการดูแล database นั่นคือเรื่องของการ backup database เลยใช้เวลาหาเรื่องเกี่ยวกับการ backup ซักระยะแล้วก็เริ่มหงุดหงิดกับบทความภาษาไทยที่บอกไม่ละเอียดเลย มีบอกนั่นนิดมีบอกนี่หน่อย พอกันทีครับไป otn ดีกว่า มือใหม่อย่างผมก็นั่งงมอยู่ซักพักก็เริ่มจับหลักได้
ผมจึงตั้งใจจะเขียนเรื่องการ backup database โดยแบ่งออกมาได้เป็น 3 ตอน
1. Oracle Database Backup & Recovery Concept
2. Oracle Database Backup (RMAN)
3. Oracle Database Recovery
แล้วจะค่อยๆทยอยเขียนให้อ่านเรื่อยๆถ้ายังไม่เบื่อกันก่อน ok เข้าเรื่องเลย
สำหรับตอนนี้เป็นตอนแรกผมอยากให้เข้าใจ concept ของการทำ backup & recovery database กันก่อนให้เข้าใจก่อนว่า failure สามารถเกิดได้ในเหตุการณ์ไหนบ้าง
Backup และ Recovery จะเกี่ยวข้องกับยุทธวิธีและขั้นตอนการป้องกันข้อมูลไม่ให้สูญหายและคืนสภาพให้กับ database เมื่อข้อมูลเสียหาย
Backup คือการ copy ข้อมูลจาก database เพื่อนำมาใช้สร้าง database เมื่อ database มีข้อมูลเสียหาย แบ่งได้เป็น 2 ประเภท

  • Physical backup คือการ backup ข้อมูลจาก physical file เช่น data file, control file, archive redo log file วิธีการ backup มี 2 วิธี
    • Manual Backup คือการเราเข้าไป copy physical database file แต่ต้องทำขณะที่ shutdown database อยู่
    • Recovery Manager (RMAN) เป็น utility ที่ Oracle ทำขึ้นมาเพื่อทำหน้าที่ backup restore and recovery โดยเฉพาะสามารถทำได้ขณะที่ database กำลัง online อยู่
  • Logical backup คือการ backup พวกข้อมูลที่เป็น Logical เช่น Tables, stored procedures ซึ่งอาจใช้ Oracle export utility
Physical backup เป็นรากฐานของการ backup ส่วน Logical backup ทำเพื่อช่วย support physical backup เพราะมันไม่สามารถกู้ Oracle database ส่วนที่เสียหายกลับคืนมาได้ทั้งหมด เช่นถ้า control file เสียหาย Logical backup ไม่สามารถกู้คืนกลับมาได้เนื่องจาก Logical มันเป็นแค่ข้อมูลที่ backup มาจาก data file

เป้าหมายของการทำ backup
  • Mean Time Between Failure (MTBF) หมายถึงเพิ่มเวลาเมื่อเกิด database failure แต่ User ยังสามารถทำงานต่อไปได้โดยไม่รู้สึกว่า database failure
  • Mean Time To Recover (MTTR) คือการใช้เวลาให้น้อยที่สุดในการ recovery database
  • ป้องกันไม่ให้เกิด Database Failure
  • เมื่อ Recovery กลับมาแล้วข้อมูลควรเสียหายน้อยที่สุด และต้องใช้งานได้เหมือนเดิม

Database Failure ที่อาจเกิดขึ้นได้
  • Statement Failure สาเหตุเกิดจาก
    • syntax ไม่ถูกต้อง
    • application logic failure
    • User ไม่มีสิทธิ์ส่งคำสั่งนั้น
    • User ใช้พื้นที่ tablespace เกิน quota ที่กำหนด ถ้าเกิดปัญหาในข้อนี้สามารถแก้ได้โดยให้ dba เพิ่ม quota ให้ user แต่เราสามารถดักให้ error ที่เกิดขึ้นนี้หน่วงเวลาออกไปได้โดยเข้าไปกำหนดใน parameter RESUMABLE_TIME=xxx (วินาที) ซึ่งในระหว่างนี้ให้ dba เข้าไปเพิ่ม quota ให้กับ user ที่เกิดปัญหาหลังจากนั้น statement ที่ error นั้นสามารถทำงานต่อไปได้
    • failure ประเภทนี้ที่ไม่ต้องมี backup และไม่ต้องทำ recovery เพราะไม่มีผลกระทบอะไรกับ database Oracle สามารถจัดการกับปัญหาที่เกิดขึ้นทั้งหมดได้

  • User Process Failure สาเหตุเกิดจาก
    • User ที่ disconnect database แบบผิดปกติ เช่น user ทำ transaction ต่างๆอยู่แล้วยังไม่ commit เกิดข้อผิดพลาดขึ้นใน application ทำให้ application ต้องหยุดการทำงานไปทำให้ user ออกจาก database แบบผิดปกติ
    • ซึ่งถ้าเกิดความผิดปกติประเภทนี้ เราจะรู้ได้ทันทีจาก background process Process Moniter (PMON) โดยสิ่งที่ Oracle จะแก้ไขปัญหานี้คือ Oracle จะ rollback transaction ที่ทำค้างของ User คนนั้น และปลดล็อคคืนให้กับระบบ failure ประเภทนี้ไม่ต้องมี backup และไม่ต้องทำ recovery

  • Network Failure สาเหตุเกิดจาก
    • Listener Fails เมื่อเกิดเหตุการณ์นี้ client จะไม่สามารถเข้ามาใช้งาน Oracle Database ได้เลย เป็น failure ที่เล็กน้อยแต่เป็นปัญหาใหญ่ การป้องกันไม่ให้เกิด failure ประเภทนี้คือ สร้างเส้นทางสำรองให้กับ listener ทำโดยสร้าง listener process อีก 1 ตัว แล้วเลือก option connection fail over เป็น advance option จากนั้นเราต้องทำให้ client รู้จัก listener รู้จักกับเส้นทางสำรองผ่าน listener โดยการ config tnsname.ora
    • ระบบ network fails
    • ปัญหาอย่างนี้ไม่เกี่ยวข้องกับข้อมูลของ database เลยไม่ต้องมี backup ไว้

  • User Error สาเหตุเกิดจาก
    • ความผิดพลาดจาก user เอง เช่นการลบ table ผิดซึ่งพบได้บ่อยมาก ใน Oracle Database 10g จึงได้เพิ่ม feature ใหม่เข้ามาคือ flashback ซึ่งสามารถเอา table ที่ถูกลบไปแล้วกลับมาได้ด้วย user คนนั้นเอง แต่ก็ต้องดูด้วยว่าข้อมูลที่จะ flashback กลับมานั้นยังอยู่ใน undo table หรือไม่
    • ตัวอย่างการใช้คำสั่ง flashback
      SQL> DROP Table hr.job_history;
      Table dropped.
      SQL> FLASHBACK TABLE hr.job_history TO BEFORE DROP;
      Flashback complete.
      ตารางที่ลบไปแล้วจะถูกเปลี่ยนชื่อโดยขึ้นต้นว่า bin ถ้าเราต้องลบ table ที่อยู่ใน recycle bin คำสั่ง PURGE
      ตัวอย่างการใช้คำสั่ง purge
      SQL> purge recyclebin ; อันนี้ลบทั้งหมด
      SQL> purge table ... ;
      SQL> purge index ... ;
      Failure ประเภทนี้อาจต้องใช้ backup เพื่อทำ recovery เพราะว่าถ้าใช้ คำสั่ง PURGE จะทำให้ table ที่อยู่ใน recycle bin จะถูกลบไปถาวร

  • Media Failure อาจเกิดขึ้นกับ disk ที่ไม่ว่ากรณีใดๆ เมื่อเกิดขึ้นแล้วต้องมี backup และต้องทำ recovery ให้กับ database

  • Instance Failure สาเหตุอาจเกิดจาก
    • ไฟดับ
    • Hardware failure
    • Background processes Failure
    • Emergency shutdown เช่นการส่งคำสั่ง shutdown ABORT และ start FORCE
    • Failure ประเภทนี้ต้องมี backup เพื่อเอาไว้ recovery Failure ประเภทนี้ Oracle สามารถตรวจเจอได้เอง
      การที่ Instance Failure มีโอกาสสูงที่จะทำให้ข้อมูลไม่ synchonize กันเพราะเมื่อมีการส่งคำสั่ง update เข้ามามีผลทำให้ข้อมูลมีการเปลี่ยนแปลง ข้อมูลที่เปลี่ยนแปลงจะถูกเก็บลงใน redo log buffer แล้วเมื่อ user ส่ง commit เข้ามาข้อมูลที่เปลี่ยนแปลงจึงถูกเขียนลงใน redo log file แต่ยังไม่เขียนข้อมูลที่เปลี่ยนแปลงลงใน data file มันจะรอจนถึงกระบรวนการ checkpoint ให้ background process Database Writer (DBWR) เขียนข้อมูลลง data file ให้เป็นข้อมูลเดียวกันระหว่าง redo log file กับ data file ข้อมูลทั้งสอง file จึง synchonize กัน แต่ถ้าระหว่างนี้ เกิดเหตุการณ์ที่ทำให้เกิด Instace Failure ทำให้ข้อมูลที่ถูกเปลี่ยนแปลงล่าสุดจริงๆอยู่ที่ redo log file แต่ Oracle สามารถตรวจจับความผิดปกติตรงนี้ได้และแก้ไขให้เราแต่ต้องอาศัยให้ dba startup database ให้
      ขั้นตอนการทำงานของ Instance Recovery
      ข้อมูลตัวสำคัญที่บอกว่าข้อมูล synchonize กันหรือไม่นั่นค่าของ SCN (System Change Number) ค่า SCN จะบอกว่า ณ ตอนนี้ข้อมูลมีการเปลี่ยนแปลงไปครั้งที่เท่าไหร่แล้ว SCN จะเกิดขึ้นทุกครั้งที่มีการ commit Database จะสร้างเลข SCN ขึ้นมา 1 ตัวและบวกเพิ่มขึ้นไปเรื่อยๆ แล้วเก็บลงใน data file, control file, redo log group
      ตัวอย่าง Instance Failure
      ใน redo log group กับ control file ค่า SCN ล่าสุดคือ 143 แต่ data file ค่า SCN ล่าสุดคือ 140 จะเห็นว่าค่าตอนนี้ไม่ synchonize กัน ซึ่ง background process ที่จะมา stamp ให้ค่า SCN ตรงกันคือ background process Check Point (CKPT) เมื่อมา stamp แล้วเห็นว่าค่า SCN ไม่ตรงกันก็บอกให้รู้แล้วว่า Instance Failure จึงต้องทำ Instance Recovery จากนั้นจะไปเรียกให้ SMON ให้ทำงาน โดย SMON จะทำอยู่ 2 operation นั่นคือ Row forward กับ transaction ที่ commit แล้วคือเอาข้อมูลที่อยู่ใน redo log file ไป update ใน datafile ให้แล้ว, Row backward กับ transaction นั้นถูก rollback หรือถูก force ให้ rollback คือไปเอาข้อมูลใน undo data มาใส่ใน table เหมือนเดิม
      การทำ Instance จะต้องมีจุดเริ่มทำซึ่งจะเกี่ยวข้องกับ checkpoint คือเริ่มทำในตำแหน่งที่ยังไม่ถูกทำ check point เป็นต้นมา จะเห็นว่า checkpoint ถี่ก็มีข้อดีคือ recvoery เร็วขึ้น แต่ก็ทำให้ performance ตกลงเช่นกันเมื่อทำ checkpoint การจะดูว่าควร checkpoint ถี่แค่ไหนให้ดูจาก MTTR

Mean Time To Recovery (MTTR) ระยะเวลาในการทำ recovery
เราสามารถเข้าไปกำหนดได้ว่าเมื่อมีการ recovery ให้ใช้เวลาเท่าไหร่ ถ้าเข้าไปดูที่ OEM จะมีบอกรายละเอียดด้วยว่าถ้ามีการ recovery ต้องใช้เวลาประมาณเท่าไหร่ หรือเราเข้าไปกำหนดได้ใน Parameter FAST_START_MTTR_TARGET ถ้าเรากำหนดค่าน้อยจะมีผลทำให้ checkpoint บ่อยขึ้น แต่ถ้าใส่ค่ามากจะมีผลทำให้ checkpoint นานขึ้น ซึ่งค่ามากที่สุดคือ 3600 วินาที (1 ชั่วโมง) ค่า default คือ 0 (disable) ซึ่งตรงนี้ถ้าเป็น disable Oracle จะเข้าไปดู paramter ตัวอื่นที่เกี่ยวข้องด้วยคือ LOG_CHECKPOINT_TIMEOUT (วินาที)

การวางแผนเรื่องการ backup
  • ควรมีตารางการ backup เช่น ทุกๆวัน, ทุกๆวันพุธ, ทุกเดือน ซึ่งตรงนี้จะถี่แค่ไหนขึ้นอยู่กับ data ว่ามีการเปลี่ยนแปลงบ่อยแค่ไหน
  • ควรทำ Multiplex Control Files ถ้าไม่มี control files Instance Database จะ statup ไม่ขึ้น
  • ควรทำ Multiplex Redo log groups
  • Production System ควร run อยู่ใน ArchivedLog mode เพื่อป้องกัน loss data
  • สร้าง redundancy ให้กับระบบของเราด้วยการใช้ RAID-based เพื่อให้ระบบสามารถทำงานต่อไปได้เมื่อ disk failure และแถมยังเป็นการการรันตีว่าข้อมูลจะไม่สูญหายไปเมื่อ disk failure
  • ทำการ backup เป็นประจำเพื่อเมื่อถึงเวลาที่ต้องทำการ recovery จะได้กลับไปจุดที่ทำการ backup ครั้งล่าสุดได้ไม่ไกลจากช่วงเวลาปัจจุบันนัก
  • รักษาอุปกรณ์เก็บข้อมูล และมั่นทดสอบว่าข้อมูลที่เก็บอยู่สามารถใช้งานได้จริง
  • run noarchivelog mode เมื่อคุณแน่ใจว่าระบบมีเวลา downtime
  • หลังจากมีการเปลี่ยนแปลงโครงสร้างของ database ควรมีการ backup control file อยู่เสมอ
  • ควรมีการ backup ลงใน tape และ tape ก็ควร backup อีกเช่นกัน
  • ควรมี 2 copies ของ archived redo logs อันนึงเก็บไว้ใน disk และอีกอันเก็บไว้ในอุปกรณ์เก็บข้อมูลอย่างอื่น เพื่อที่ว่าเมื่อมีปัญหาจะได้ดึง archived redo log ที่อยู่ใน disk มาใช้งานได้อย่างรวดเร็วหรือถ้ามีปัญหาอีกก็ดึงจากอุปกรณ์เก็บข้อมูลภายนอก
  • ไฟล์ที่เราควร backup ได้แก่ data files, log files, control files, spfile หรือ init.ora, sqlnet.ora, tnsnames.ora, listener.ora และ password file
  • เก็บมี copy backup อันเก่าไว้ด้วย เผื่อที่ว่า backup ปัจจุบันใช้งานไม่ได้ขึ้นมา(ซึ่งมีโอกาสเป็นไปได้)
  • script backup ควรมีเก็บ log file ได้ด้วยเผื่อมี error เกิดขึ้นระหว่างการ backup จะได้รู้
  • แต่ละ application ควรมีการใช้งานแยก tablespace กันเพื่อที่ว่าถ้า tablespace ใดมีปัญหาเกิดขึ้น application อื่นๆยังคงใช้งานได้ต่อ
  • ใช้ snapshot technology เพื่อเก็บ system backup เพราะว่ามัน backup ได้อย่างรวดเร็วกับ database ขนาดใหญ่
  • ใช้ data pump export utility เพื่อช่วยในการสนับสนุนการ backup

Control Files
เป็น file ควบคุมเก็บสถานะการทำงานของ database โดยสิ่งที่ Control File เก็บเช่น mode การทำงานของ database, เก็บ physical structure เช่นว่า data file กี่ตัวอยู่ path อะไรที่ไหนบ้าง
Control File จะถูกอ่านเมื่อ startup database MOUNT mode แต่ยังไม่ตรวจสอบความถูกต้องของ control file ซึ่งถ้าไม่มี control file จะ startup database ได้แค่ NOMOUNT mode ดังนั้น Oracle จึงแนะนำว่าควรทำ Multiplex Control files ทั้งหมด 3 file และแต่ละตัวควรอยู่คนละ disk กัน ซึ่งตรงนี้ถ้าใช้ DBCA เป็นตัว create database จะสร้าง control file ให้ทั้งหมด 3 file
การทำ Multiplex Control Files ต้องทำ 2 ขั้นตอนคือ
  • ทำในระดับ Database เข้าไปแก้ไข parameter CONTROL_FILE (static parameter) ต้อง shutdown ก่อนจึงจะเห็นผล
    ex. CONTROL_FILES=’’,’’
  • ทำในระดับ OS เริ่มแรกให้ shutdown database ก่อนจากนั้นเข้าไป copy control file ที่ใช้งานอยู่ปัจจุบัน แล้วไปวางใน path ที่ระบุไว้ใน parameter แล้วเปลี่ยนชื่อให้ตรงกับค่าใน paramter ด้วย จากนั้น startup database แล้วเข้าตรวจสอบความถูกต้อง โดยดูได้จาก view V$CONTROLFILE
  • ข้อดีของการทำ Multiplex Control Files คือถ้ามี Control File ตัวใดตัวหนึ่งเสียหายไปอีกตัวสามารถทำงานแทนกันได้โดย Database จะไปอ่าน Control File ที่ยังใช้งานได้อยู่จาก paramter CONTROL_FILES

Redo Log Files
เป็น file ที่เก็บข้อมูลที่เปลี่ยนแปลง โดยจะมี background process log writer (LGWR) ทำหน้าที่เขียน redo log file ให้ก่อนที่จะเขียนลงใน redo log file จะมี memory ตัวนึงที่เก็บข้อมูลที่เปลี่ยนแปลงอยู่เรียกว่า redo log buffer และจะเขียนลงใน redo log เมื่อมีคำสั่ง commit หรือเหตุการณ์อื่นๆ
โครงสร้างของ redo log จะเป็น group ในแต่ละ group จะมี redo log file เป็น member ถ้าใช้ DBCA เป็นตัว create database จะสร้าง redo log group ให้ 3 group และ redo log file ให้ group ละ 1 file ซึ่งเป็นค่า default ของ DBCA แต่อย่างนี้ยังไม่เป็น Multiplex redo log file จะเป็น Multiplex redo log file ก็ต่อเมื่อในแต่ละ redo log group มีมากกว่า 1 redo log file และถ้าให้ดีแต่ละ member ควรจะแยกอยู่กันคนละ disk
ข้อดีของการทำ Multiplex Redo Log File คือ ถ้า member ใดใน group นั้นเสียหายไป Database ก็ยังทำงานได้อยู่เพราะยังมี member อีกตัวทำงานแทนกันได้ และถ้าให้ดี member ที่อยู่ใน group
Note: ถ้าใช้ DBCA สร้าง database จะมี mulitplex control file แต่ไม่มี multiplex redo log file

Archived Log Files
เป็น file ที่เก็บ copy ของ redo log file ก่อนที่ LGWR จะเขียนทับลงใน redo log file path ที่เก็บ archive log file โดย default จะเก็บอยู่ที่ตำแหน่งเดียวกับ flash recovery area ดูได้จาก parameter DB_RECOVERY_FILE_DEST ตำแหน่งที่ 10
เราสามารถกำหนด path ของ archive log file เพิ่มเติมได้ นอกจากจะเก็บลงใน default path ยังสามารถกำหนดได้เองอีก 9 path จาก parameter LOG_ARCHIVE_DEST_<1-10>=""เท่ากับเป็นการ copy archive log file เพิ่มขึ้นเหมือนเป็นการ backup ซึ่งกันและกัน วิธีนี้จะมีประโยชน์ในกรณีที่ archive log file default ใช้งานไม่ได้ database จะย้ายไปใช้อีก path ให้
โดย default archive log file จะมีก็ต่อเมื่อเรา enable archivelog mode แต่ค่า default จะเป็น disable
การตรวจว่า database ขณะนี้ run อยู่ใน mode อะไร
SQL> select archiver from v$instance;
--ถ้าค่าคือ STARTED=archivedlog mode หรือ STOPPED=noarchivedlog mode
หรือ
SQL> select name, log_mode FROM v$database;
หรือ
SQL>ARCHIVE LOG LIST; --ถ้าอยู่ใน archivedlog mode จะแสดงรายละเอียดออกมา
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 18
Next log sequence to archive 20
Current log sequence 20
การเปลี่ยน mode database ให้เป็น archivelog mode หรือ noarchivelog mode
SQL> shutdown
SQL> startup mount
SQL> ALTER DATABASE [ARCHIVELOG | NOARCHIVELOG]
SQL> ALTER DATABASE OPEN;

ถ้าสงสัยตรงไหนหรืออยากให้เพิ่มตรงไหนบอกได้ครับ
สำหรับตอนนี้ขอจบไว้เพียงแค่นี้ครับ ตอนหน้าเทคนิคเน้นๆทำ backup ให้เห็นกันจะๆครับ

Sunday 28 October 2007

ADF BC: Trigger & Entities

เมื่อเราทำการ update, insert, delete ข้อมูล และต้องการ จัดการข้อมูล record ที่เราทำงานอยู่เพิ่มเติมทุกครั้งโดยอัตโนมัติ (คล้ายการทำงานของ trigger)
เช่น ต้องการคำนวนค่าจากข้อมูลที่ใส่เข้ามา ไปใส่ใน filed อื่น ของ record เดียวกันทุกครั้งที่มีการเพิ่มข้อมูล, ต้องการใส่ชื่อผู้ใช้ทีแก้ไขข้อมูล ทุกครั้งที่มีการแก้ไขข้อมูล

ของผมที่ใช้อยู่เป็นประจำ ก็จะเป็นการบันทึกข้อมูลของ user คนล่าสุดที่มา insert, update ข้อมูล record นั้นๆ โดยที่ไม่ต้องไปเขียน code ซ้ำ ในระดับ view object อีก

การจำลองการทำงาน Trigger ใน Entities ทำได้โดยการ owerwrite method doDML (int dml, TransactionEvent evt) เราสามารถเลือกได้ว่าจะให้ มันทำงานทุกครั้งที update , insert หรือ delete โดย check ค่า dml =>DML_INSERT, DML_UPDATE, DML_DELETE

ตัวอย่าง

  • เมื่อ Entity มีการ INSERT ข้อมูล dml = DML_INSERT จะทำการใส่ค่าให้ filed Flex1 มีค่าเท่ากับ ผลรวมของ filed Flex2 และ Flex3 ทุกครั้งที่มีการ insert

  • เมื่อ Entity มีการ UPDATE ข้อมูล dml = DML_UPDATE จะทำการ update filed companyId และ updatedBy ทุกครั้งที่มีการแก้ไขข้อมูล

Oracle ADF Business Component (BC4J) ตอนที่ 4 View Object

คราวก่อนเราได้สร้าง Entity Object ไปแล้ว วันนี้ผมจะสร้าง View Object บ้าง

View Object เป็น Component ทำหน้าที่สร้าง Collection ของกลุ่มข้อมูลที่ดึงจาก DB ซึ่งอาจจะอยู่ในรูปของ SQL หรือไม่ก็ดึงกลุ่มข้อมูลผ่าน Entity Object ในแต่ละ Row ทำให้แบ่งประเภทได้ 2 ประเภทด้วยกัน คือ

1. Updatable View เป็นการดึงกลุ่มข้อมูลผ่าน Entity Object ทำให้เราสามารถที่จะ Insert , Update, Delete ได้

2. Read-only View เป็นการดึงกลุ่มข้อมูลผ่าน SQL ทำให้ไม่สามารถ Insert , Update, Delete ได้ เหมาะสำหรับการแสดงผลข้อมูลเฉยๆ ที่ไม่ต้องการทำ Transaction กับข้อมูล

เรามาลองสร้าง Updatable View กันครับ โดยผมจะใช้ Customers Entity Object จากคราวที่แล้วกัน

1. คลิกขวาที่ Project เลือก New นะครับจะขึ้นมาตามรูป Expand Business Tier จะเห็น ADF Business Component เลือก View Object ครับ


2. ผมตั้งชื่อ View Object ว่า CustomersView และเลือก View แบบ Updatable View

3. เลือก Customers Entity Object มาไว้ข้างขวา


4. เลือก Attibute ที่ต้องการแสดงบน View Object ผมเลือกหมดเลยครับ

5. แสดงรายละเอียดของแต่ละ Attribute

6. แสดง SQL ที่ถูกสร้างขึ้นเพื่อไปดึงข้อมูลมาเก็บใน Entity Object แต่ละตัว เพื่อให้ View Object นำมาแสดงผลครับ ตรงนี้เราสามารถที่จะ เพิ่ม Where Clause หรือคำส่ง Order By ได้

7. หลังจากนั้นกด Finish ก็จะได้ Component CustomersView เกิดขึ้น โดยถ้ามองที่ Structure ก็จะประกอบไปด้วย 2 file คือ

1. CustomersView.xml เป็น configuration file ที่บอกว่า View ตัวนี้เชื่อมต่อกับ Entity Object ตัวไหน ใช้ SQL อะไรในการดึงข้อมูลครับ
2. CustomersViewImpl.java เป็น JAVA Class ที่รวม method เกี่ยวกับการจัดการกับกลุ่มข้อมูล รวมทั้งยังสามารถสร้าง method ที่ทำ Business Logic ได้ด้วย

เท่านี้ก็เป็นอันเรียบร้อย คราวหน้าผมจะมาสร้าง Client ติดต่อกับ View Object กันบ้างครับ ขอตัวไปทำงานก่อน

บท​ความ​ที่​เกี่ยวข้อง

Saturday 27 October 2007

ปัญหาเบื้องต้นเมื่อทดลองใช้งาน Oracle Database 11g บน Windows

หลังจากที่ Oracle เปิดให้ download 11g บน windows แล้ว เมื่อวานได้มีโอกาสติดตั้งและทดลองใช้งานเบื้องต้นครับ
ขั้นตอนการติดตั้งไม่ยากครับ ตามไปดู screenshots ได้ที่นี่ครับ

หลังจากติดตั้งเสร็จ จะพบปัญหาอยู่ 2 เรื่องดังนี้

1. ใช้ Toad และ SQL Navigator ไม่ได้ โดยจะได้รับ error ว่า

OCI version 11.1.0.1.0 is not supported

ดังนั้นต้อง work around โดยการย้ายให Toad และ SQL Navigator ไปอ่าน OCI จาก home 10g เป็นการชั่วคราว

2. หลังจากแก้ปัญหาข้อแรกไปได้ ก็จะเจอปัญหาถัดมาคือ Toad ไม่สามารถ authen เข้าไปใน Database ได้
ถ้าใครยังจำได้ ผมเคยเล่าเรื่อง 11g จะ support password แบบ case sensitive แล้ว
เนื่องจาก Toad มีกลไลจะ UpperCase password ที่เราใส่โดยอัตโนมัติ
ทำให้ password ของเราจะ authen ไม่ได้
work around ก็คือ ต้องเปลี่ยน password ใน Database ให้เป็นตัวใหญ่หมด
เช่นแต่เดิม scott password คือ tiger เราก็ต้องเปลี่ยนเป็น TIGER แทน
เพื่อให้สามารถใช้งาน Toad ได้ครับ

ส่วนปัญหานี้ SQL Navigator ไม่เป็นครับ

Friday 26 October 2007

Tuning Embedded OC4J บน JDeveloper 11g Technical Preview 2

อ้างอิงจากนาย Steve Muench ที่ได้เขียนเรื่องการ tuning Embedded OC4J บน JDeveloper 11g Technical Preview 2

โดยนาย Steve Muench แจกแจงว่าเมื่อ disable java policy ในส่วน BCEL proxy นี้จะทำให้ Embedded OC4J start ได้เร็วขึ้นมากถึง 20 วินาที

ผมจึงทดลองตามขั้นตอนของนาย Steve Muench ดังนี้ครับ

1. คุณต้องเคย start Embedded OC4J ขึ้นมาก่อนนะครับ เพราะว่าถ้ายังไม่ใช้งาน file config ของ Embedded OC4J จะยังไม่ถูกสร้างขึ้นมา

2. ไปที่ JDeveloper profile home path ดังนี้ครับ

xp: C:\Documents and Settings\username

vista: C:\Users\username\AppData\Roaming\JDeveloper

3. ไปต่อที่ path นี้ system11.1.1.0.20.46.84\o.j2ee\embedded-oc4j\config

4. เปิด file java2.policy ขึ้นมา

5. ให้ comment ในส่วนนี้ออกครับ

จาก
grant codeBase "file://generated/by/oracle.j2ee.connector.proxy.BCELProxyClassLoader" { permission java.security.AllPermission; };
เป็น
/*grant codeBase "file://generated/by/oracle.j2ee.connector.proxy.BCELProxyClassLoader" { permission java.security.AllPermission; }; */

ก่อนลงมือทำใช้เวลา start OC4J เพื่อ run EJB Application ใช้เวลา 55 วินาที
หลังลงมือทำใช้เวลา start OC4J เพื่อ run EJB Application ใช้เวลา 42 วินาที

สรุปจาก environment ของผมเมื่อทดลอง tuning Embedded OC4J ทำให้ทำงานได้เร็วขึ้น 13 วินาที
ถึงแม้จะไม่ได้ 20 วินาทีตามที่ นาย Steve Muench อ้างไว้ แต่ได้เท่านี้ผมก็ happy ครับ

Thursday 25 October 2007

ภาษาโปรแกรมคอมพิวเตอร์ตัวไหนที่เหมาะกับคุณ (ขำ ๆ)

คุณเคยเจอปัญหาเช่นนี้เหรอไม่
จะหัดเล่นภาษาไหนดี ?
จะหัดเล่นภาษาที่ตลาดต้องการตอนนี้ ดีป่าว ?
เล่นภาษาที่มีข้อมูลให้ศึกษาเยอะๆ ?
เลือกภาษาที่ได้ค่าตอบแทนเยอะๆ ดีมั๊ย?
เขียน java อยู่ดีๆแล้วรู้สึก ยากฉิบ ทำไมมันเรื่องมากนักวะ ?
เขียน php แล้ว เห มันไม่ใช่อะจิ๊บ...
เขียน asp แล้วรู้สึก เอ microsoft มัน จะผูกขาดไปเหรอเปล่า ?
เขียน perl อยู่ดีๆ เอ......... ทำไมนาตาลีต้องได้กับเจ้าบอล ?

วันนี้เรามีทางออกมาให้คุณ แบบทดสอบเพื่อดูว่าคุณเหมาะกับภาษาโปรแกรมคอมพิวเตอร์ตัวไหน
ลองเล่นดูครับ คุณอาจพบภาษาที่เหมาะกับคุณจริงๆ

คำเตือน ภาษาโปรแกรมคอมพิวเตอร์เป็นเพียงเครื่องมือในการทำงาน โปรดเลือกภาษาให้เหมาะกับงานที่จะทำ





Wednesday 24 October 2007

การ Config Data source ใน JBoss

เมื่อเราต้องการเรียกใช้งาน data source ใน JBoss โดย default data source ของ JBoss 4.0 จะใช้ HypersonicDB ถ้าต้องการใช้ Oracle Database ต้องเข้าไปแก้ไขดังนี้

1. copy Oracle Dirver classes <ORACLE_HOME>/jdbc/lib/classes12.zip to <JBOSS_HOME>/server/default/lib

2. copy Oracle transaction (non-XA) data source <JBOSS_HOME>/docs/examples/jca/oracle-ds.xml to <JBOSS_HOME>/server/default/deploy

3. modify oracle-ds.xml set <connection-url/>, <driver-class/>, <user-name> and <password>

- Oracle OCI Type 2 Driver
Class: oracle.jdbc.driver.OracleDriver
URL: jdbc:oracle:oci8:@<database>
- Oracle OCI Thin Type 4 Driver
Class: oracle.jdbc.driver.OracleDriver
URL: jdbc:oracle:thin:@<host>:<port>:<database>
- Oracle OCI XA Type 2 Driver
Class: oracle.jdbc.xa.client.OracleXADataSource
URL: jdbc:oracle:thin:@<host>:<port>:<database>
- Oracle OCI Type 2 Driver
Class: oracle.jdbc.driver.OracleDriver
URL: jdbc:oracle:oci8:@<database>

<user-name>scott</user-name>
<password>tiger</password>


<host> ชื่อ hostname ที่กำหนดอยู่ใน <ORACLE_HOME>/network/ADMIN/tnsnames.ora ของ instance database นั้นๆ
<port> หมายเลข port ที่กำหนดอยู่ใน <ORACLE_HOME>/network/ADMIN/tnsnames.ora ของ instance database นั้นๆ
<database> ชื่อ database

4. modify <JBOSS_HOME>/server/default/conf/standardjaws.xml or <JBOSS_HOME>/server/default/conf/jaws.xml set <datasource> and <type-mapping>
<jaws>
<datasource>java:/OracleDS</datasource>
<type-mapping>Oracle8</type-mapping>
</jaws>


5. modify <JBOSS_HOME>/server/default/conf/standardjbosscmp-jdbc.xml or META-INF/jbosscmp-jdbc.xml set <datasource> and <datasource-mapping>
<jbosscmp-jdbc>
<defaults>
<datasource>java:/OracleDS</datasource>
<datasource-mapping>Oracle8</datasource-mapping>
</defaults>
</jbosscmp-jdbc>


6. modify <JBOSS_HOME>/server/default/conf/login-config.xml add <application-policy>
<application-policy name = "OracleDbRealm">
<authentication>
<login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule" flag = "required">
<module-option name = "principal">sa</module-option>
<module-option name = "userName">sa</module-option>
<module-option name = "password"></module-option>
<module-option name ="managedConnectionFactoryName">
jboss.jca:service=LocalTxCM,name=OracleDS
</module-option>
</login-module>
</authentication>
</application-policy>


แต่ถ้าอยาก config database อื่นเข้าไปดูได้ที่
How to Configuring JBoss 4.0 JDBC Connectivity

Monday 22 October 2007

การเปลี่ยน port OC4J จาก 8888 เป็นอื่น ๆ

Oracle Application Server จะมี engine หลักคือ OC4J ที่ทำหน้าที่เป็น container ให้ feature อื่น ๆ ทั้งหมด. OC4J ชื่อเต็ม ๆ คือ Oracle Container for J2EE แต่เดิมชื่อ Orion ซึ่งก็ถูก Oracle ซื้อมาเช่นกันเมื่อประมาณ 7 ปีก่อน. ถ้าใครได้ทดลอง config ในรายละเอียดลึก ๆ จะเห็นว่า ยังมี file ชื่อ Orion ค้างอยู่เป็นจำนวนมาก.


เข้าสู่ประเด็นหลักของ post นี้. ก็คือการ config เปลี่ยน port ของ OC4J จาก 8888 เป็น port อื่น ๆ ตามต้องการ. วิธีการมีง่าย ๆ ดังนี้


  1. หลังจากติดตั้งสำเร็จ การติดตั้งให้ย้อนไปดูที่ post นี้

  2. ไปที่ OC4J Home แล้วตามด้วย path ดังนี้ /j2ee/home/config

  3. ไปที่ file ชื่อ default-web-site.xml แล้วเปิดมันขึ้นมา

  4. หา 8888 แล้วแทนค่าด้วย port ที่ต้องการ

  5. เป็นอันสำเร็จ :)

Sunday 21 October 2007

Oracle ADF Business Component (BC4J) ตอนที่ 3 มาต่อกับ Entity Object

เราต่อจากคราวที่แล้วกันนะครับ วันนี้ผมจะสร้าง Main Class ขึ้นมาเพื่อแสดงการเรียกใช้ Entity Object กัน

ก่อนอื่นผมจะต้องสร้าง Application Module ขึ้นมาก่อน เพราะว่า Entity Object ไม่สามารถทำงานนอก Application Module ได้ แต่ผมจะไม่ลงลึกรายละเอียดเกี่ยวกับ Application Module มาก เอาไว้วันหลังผมจะอธิบายให้ฟังเรามาเริ่มกันเลยครับ ขั้นตอนมีดังนี้

1. คลิ๊กขวาที่ Project เลือก New จะขึ้นรูปให้ Expand ตรง Business Component Tier จะเห็น ADF Business Component เลือก Application Module


2. ทำการตั้งชื่อ ผมตั้งชื่อว่า CustomersService จากนั้นกด Next จนสุด แล้วกด Finish


3. เมื่อทำการสร้าง Application Module ชื่อ CustomerService เรียบร้อยแล้ว จะปรากฎเป็นComponent รูปกระเป๋าเพิ่มขึ้นมา
สังเกตที่ Structure จะประกอบไปด้วย 3 file คือ

1. CustomersServices.xml เป็น Configuration file ที่ระบุว่าจะ Map กับ Class JAVA ไหน ครับ ซึ่งในที่นี้คือ CustomersServicesImpl.java นั่นเอง

2. CustomersServicesImpl.java ปกติจะเป็น Class JAVA ที่จะ Map กับ View Object ที่เกี่ยวข้องใน Module แต่เนื่องจากว่าเราไม่ได้ Add View Object เข้ามา มันก็เลยไม่เจอครับแต่ Class นี้เรายังสามารถสร้าง Business Logic เอาไว้เพื่อให้ Tier อื่นๆมาเรียกใช้ได้

3. bc4j.xcfg เป็น Configuration file ที่บอกว่าใน package model มี Application Module อะไรบ้าง

คราวนี้เราจะมาเริ่มเขียนโค้ดกันแล้วครับ หลังจากที่ใช้แต่ Tool ช่วยมานาน

โจทย์ของผมคือ ค้นหาชื่อข้อมูลลูกค้าด้วย Primary Key คือ Customer ID กันครับ ขั้นตอนมีดังนี้

1. คลิ๊กที่ตัว CustomersServicesImpl.java ที่ Structure Tab ครับ จะเป็นดังรูป


2. สร้าง Method ขึ้นมา 1 Method ตามรูปโดยรับ Argument เป็น CustomerID แล้ว Return เป็น ชื่อของลูกค้าคนนั้น

3. ใน CustomersServicesImpl.java จะมี Main Class อยู่แล้ว ผมจะ Comment ตรงส่วน Code ที่ Jdeveloper ให้มา จากนั้นเพิ่มโค้ดตามรูป

โดย Configuration.createRootApplicationModule จะทำหน้าสร้าง Instance ของ Application Module ที่ต้องการใช้ จากนั้นเราทำการ Casting เป็น Application Module ที่เราต้องการ ก็จะสามารถเรียก Method นั้นได้เลย

service.findCustomersByPK(118) ผมได้เรียก method findCustomersByPK โดยส่ง Customer ID = 118 ไป

4. เมื่อทำการรันจะได้ผลตามรูป