ทำความรู้จักกับ EntityManager

ใน JPA Spec มีรูปแบบ EntityManager หรือ Persistence Context ไว้หลายแบบประกอบด้วย

  • ชนิดของ Persistence Context
    • Extended
    • Transaction
  • การจัดการกับ EntityManager
    • Container Managed
    • Application Managed
  • ชนิด Transaction ของ EntityManager
    • RESOURCE_LOCAL
    • JTA

อ่าน spec ได้จาก JSR 220 Specification

จากองค์ประกอบด้านบนจะมีบางอย่างเท่านั้นที่ใช้ได้ใน Java EE และเช่นกันจะมีบางอย่างเท่านั้นที่ใช้ได้ใน Java SE โดยในบทความนี้ผมจะยกข้อแตกต่างของแต่ละแบบเปรียบเทียบกัน…

Extended vs Transaction Persistence Context Type
Persistence Context type เป็นหนึ่งฟีเจอร์ของ EntityManager โดยค่าดีฟอลต์แล้วจะเป็น Transactional ใช้สำหรับการแก้ไข หรือ flush managed bean (managed bean คือ bean ที่ยังอยู่ใน scope ของ transaction และ bean นั้นจะถูกบันทึกการเปลี่ยนแปลงจนกว่า transaction จะ commit และหลังจาก transaction commit แล้วเราจะเรียกสถานะของ bean นั้นว่า detatched ซึ่งการเปลี่ยนแปลงค่าของ bean จะไม่มีผลกับ Persistence Context อีก)

ส่วน Extended นั้นจะใช้ได้กับ Stateful EJB(SFSB = Stateful Session Bean) เท่านั้น เพราะ SFSB ต้องมี state ซึ่งหลังจากจบ method แล้วไม่ได้หมายความว่าต้องจบ Transaction ด้วย

แต่สำหรับ SLSF(Stateless Session Bean) นั้นต่างออกไปเมื่อเราจบ business method แล้ว transaction ควรสิ้นสุดลง เพราะเมื่อเราเรียก method นั้นใหม่เราต้องทำการใช้ EJB instance ตัวใหม่ ซึ่งทำให้ หนึ่ง Method จึงเท่ากับหนึ่ง Transaction ดังนั้น SLSB จึงใช้ได้เฉพาะ Transaction type เท่านั้น

ข้อมูลเพิ่มเติมของ Persistence Context type อ่านได้จาก JSR 220 ใน JSR-000220 Enterprise JavaBeans 3.0 Final Release (persistence) หัวข้อที่ 5.6.1 และ 5.6.2

Persistence Context Type เราสามารถเลือก type ได้ตอนที่ EntityManager ถูก inject เข้ามาโดยเราสามารถเขียนโค๊ด

@PersistenceContext(type=javax.persistence.PersistenceContextType.EXTENDED)
EntityManager em;

ซึ่ง default ถ้าเราไม่กำหนดจะมี type เป็น javax.persistence.PersistenceContextType.TRANSACTION

โดยการใช้งาน Persistence Context Type จะใช้งานได้เมื่อเป็น Container Managed EntityManager เท่านั้น ในกรณีของ Application managed EntityManager จะแตกต่างออกไป สามารถอ่านเพิ่มเติมได้จากหัวข้อ 5.7 ของ JSR-000220 Enterprise JavaBeans 3.0 Final Release (persistence)

Container Managed vs Application Managed
โดยปกติแล้วเรามักจะทำการ inject EntityManager โดยใช้ @PersistenceContext เช่น

@PersistenceContext
EntityManager em;

โดยการเขียนแบบข้างบนเป็นการบอกให้ Container Inject EntityManager มาให้เรา นั้นหมายความว่าการเรียกใช้งานแบบนี้เป็น Container Managed EntityManager 😛

แต่ในทางกลับกัน ถ้าเราสร้าง EntityManager ขึ้นมาเองจาก EntityManagerFactory

@PersistenceUnit
EntityManagerFactory emf;
...
emf.createEntityManager();
...

ซึ่งวิธีนี้เราจะได้ EntityManager จากการเรียกใช้ method createEntityManager() และวิธีการนี้เองเราเรียกมันว่า Application Managed EntityManager เมื่อเราสร้าง EntityManager ขึ้นมาเราต้องเป็นคนปิด EntityManager ด้วยโดยเราต้องเขียนคำสั่งการ Manage(สร้าง และ ปิด) มันไว้ใน Application ของเรานั้นเองครับ

Appliction Managed PersistenceContext นั้นจะมีขนิดของ PersistenceContext Type เป็น extended เพราะว่าเราสามารถควบคมการเปิด ปิดของ Persistence Context ได้ด้วยตัวเราเอง ดังนั้นมันจึงทำงานข้าม business method หลายๆอันได้

JTA vs RESOURCE_LOCAL



me on google plus+Jirawong Wongdokpuang

Monitoring Java Virtual Machine

จากบทความ Java Virtual Machine Memory Management ทำให้เราพอทราบได้แล้วว่าการทำงานของ GC ใน Virtual Machine ทำงานอย่างไรทีนี้ เราก็มาดูของ จริงกันว่าโปรแกรม java ของเรามันใช้งานไปเท่าไหร่ มีอะไรเกิดขึ้นบ้างระหว่างการทำงานของมัน โดยผมเลือกใช้เจ้า jvmstat ดาวโหลดได้จาก http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-jvm-419420.html#jvmstat-3_0-mr-oth-JPR มาทำการ ตรวจสอบดูว่า Virtual Machine ของเราใช้ memory ไปเท่าไหร่แล้ว ซึ่งเจ้าโปรแกรมตัวนี้จะแสดงผลออกมาเป็นแบบกราฟให้เราได้ชมกัน

ตัวอย่างของผมจะใช้เครื่อง Mac OS X และผมจะทำการ Monitoring JVM ของ Tomcat นะครับ โดนก่อนอื่นเลยสำหรับ คนที่ใช้ Mac ต้องทำ symbolic link ของ jar ไฟล์ที่ยังไม่ครบก่อนนะครับ สำหรับ OS อื่นๆให้ข้ามตรงนี้ไปเลยครับ

Continue reading

Java Virtual Machine Memory Management

ในการจัดการ memory ของ jvm นั้นจะแบ่งส่วนต่างๆ ออกเป็นสามส่วนหลักๆคือ
Young Generation, Old Generation และ Permanent Generation ซึ่งแต่ละส่วนจะมีหน้าที่จัดการกับ memory อย่างชัดเจน

Screen Shot 2556-01-03 at 11.57.08 PM

ภาพนี้เป็นภาพที่สวยที่สุดแล้วจากความพยายามใช้ openoffice ของผม

Continue reading

JSR 330: Dependency Injection for Java Example

JSR 330: Dependency Injection for Java เป็นการทำ DI(Dependency Injection) ใน Java สำหรับ JSR 330 ได้ Specification Leads จาก SpringSource คือ Rod Johnson ซึ่งเป็นคนสร้าง Spring Framework และ Co-Founder ของ SpringSource และ Bob Lee ผู้สร้าง Guice framework และได้รับรางวัล Jolt Awards (Java Collections Framework ของ Joshua Bloch ก็ได้รับรางวัลนี้เช่นเดียวกัน ซึ่ง Joshua Bloch ก็เป็นคนเขียนหนังสือยอดนิยมชื่อ Effective Java เมื่อกล่าวแบบนี้แล้วน่าจะพอคุ้นเคยกันบ้างนะครับ แต่เรื่องนี้ไม่ได้เกี่ยวกับ JSR 330 ที่กำลังพูดถึงอยู่ แค่เล่าให้ฟังเฉยๆ) สำหรับ Example นี้ผมจะแยกออกเป็นสามส่วนคือ DAO , Service และส่วนของ Servlet ซึ่งผมได้ทำการเพิ่ม Dependency ในโปรเจคผมตามนี้ครับ(โปรเจคเป็น maven project นะครับ)

Continue reading

Type Parameter Naming Conventions


เคยสังเกตหรือไม่ว่า API ที่มีการใช้งานแบบ Generic Type นั้นมักใช้ตัวแปรพวก K , V , T อย่างเช่น List<E> อะไรแบบนี้ ถึงแม้ที่จริงแล้วมันจะใส่อะไรก็ได้ แต่ถ้าจะให้ดีความใส่ให้มีความหมาย ซึ่งหากดูตาม Conventions แล้วจะมีดังนี้

E – Element (used extensively by the Java Collections Framework)
K – Key
N – Number
T – Type
V – Value
S,U,V etc. – 2nd, 3rd, 4th types

Ref : Oracle Docs



me on google plus+Jirawong Wongdokpuang

JSR 310: Date and Time API Example

JSR 310: Date and Time API เป็น api ที่เกี่ยวกับ วันและเวลา ซึ่งได้ Stephen Colebourne founded และ leads ของ Joda-Time project Michael Nascimento Santos founded และ leads ของ Genesis project และ Roger Riggs ซึ่งเป็นทึมงานของ Oracle มาเป็น Specification Leads โดยในขณะที่ผมเขียนบทความนี้ JSR 310 อยู่ในสถานะ Active ใน JCP ver. 2.9

JSR 310 นั้นเป็น API ที่มีความใกล้เคียงกับ Joda-Time มาก(ก็ได้ project founder มาเป็น spec leads นี่หน่า) โดย package ของ JSR 310 จะอยู่ใน javax.time เสียส่วนมาก สำหรับคนที่ใช้งาน Joda-time อยู่เป็นนิจอยู่แล้วคงไม่ต้องอะไรมากกับ api ตัวนี้ครับ เพราะต่างกันน้อยมาก เท่าที่เห็นก็น่าจะเป็นพวก enum และ builder pattern ที่ถูกใส่เข้ามาให้ใช้งานง่ายขึ้น

Continue reading

ใส่สีให้กับ Terminal ของ Mac OSX


หลังจากประเดิมเจ้าเครื่อง iMac 21.5″ มาได้ซักอาทิตย์แล้วความหงุดหงิดที่ติดตลอดคือ เวลาใช้ Terminal ของ osx นี้มันไม่สวยงามเอาซะเลย ช่างเป็นข้อมูลที่ทื้อๆ เลยหาวิธีที่จะมันมีสีสันขึ้นมาซักหน่อย โดยให้ข้อความเป็นสีเหมือนตอนใช้ bash ใน ubuntu ซึ่งก็มีวิธีการที่สุดแสนจะเรียบง่าย ดังนี้ครับ

      เปิด Terminal
      พิม export CLICOLOR=1 กด Enter
      พิม export LSCOLORS=GxFxCxDxBxegedabagaced กด Enter

เพียงเท่านี้ Terminal ก็จะมีสีแล้ว

Screen Shot 2555-12-11 at 12.44.00 AM

จากภาพด้านบนจะเห็นว่า สีของ Folder กับไฟล์จะแสดงคนละสีกัน

แต่ว่าวิธีที่ทำไปนั้นเมื่อเปิดขึ้นมาใหม่มันก็กลับมาเป็นข้อความสีดำหมดเหมือนเดิมถ้าหากเราต้องการให้มันค้างอยู่ตลอดไปให้เราใช้คำสั่งนี้ครับ

$ touch ~/.bash_profile
$ echo "export CLICOLOR=1" >> ~/.bash_profile
$ echo "export LSCOLORS=GxFxCxDxBxegedabagaced" >> ~/.bash_profile

ทีนี้ไม่ว่าเราเปิด Terminal ตอนไหนเราจะเห็นสีของ ข้อความที่แตกต่างกันแล้วครับ



me on google plus+Jirawong Wongdokpuang