10.5.10

Improve performance in JDBC

เลือก Driver ให้เหมาะกับงานที่กำลังทำอยู่
JDBC สร้าง driver ออกมาสี่ประเภทขึ้นอยู่กับความต้องการที่เราจะต้องเลือกไปใช้
  • JDBC-ODBC ใช้เมื่อไม่มี driver ที่สร้างสำหรับภาษา Java แต่มีรองรับ ODBC แต่การเชื่อมต่อด้วยแบบนี้จะช้ากว่าประเภทอื่นๆ เพราะต้องเรียกผ่าน ODBC อีกทีหนึ่ง
  • Native API ใช้เมื่อมี driver ที่สร้างสำหรับ Java เพื่อไม่ต้องผ่าน ODBC เหมือนกับแบบ JDBC-ODBC ดังนั้นประสิทธิภาพจึงดีกว่าประเภทที่ 1 แต่ประสิทธิภาพจะปานกลาง เมื่อเทียบกับแบบที่ JDBC-Net
  • JDBC - Net ใช้เมื่อติดต่อผ่าน proxy server เช่นพวก application server ทั้งหลาย (websphere, weblogic, ...) ประเภทนี้ง่ายต่อการ optimization เช่น connection pooling, caching, loga balancing และอื่นๆ

เลือกที่จะควบคุม transaction เอง
java.sql.Connection interface เตรียม method เพื่อจัดการกับ transaction ดังนี้
  • boolean getAutoCommit();
  • void setAutoCommit(boolean autocommit);
  • void commit();
  • void rollback();
ด้วย default JDBC transaction จะ commit ให้เองเมื่อแต่ละ statement ถูก execute นั่นคือ AutoCommit mode เป็น true โดยเราไม่จำเป็นต้องเรียก commit() method เอง มันง่ายต่อนักพัฒนา ถ้าเราต้องการ execute แค่หนึ่ง statement แต่จะให้ประสิทธิภาพที่ไม่ค่อยดีเมื่อมีหลาย statement ที่ต้อง execute เพราะว่ามันจะ commit หลังจากที่ statement แรกทำงานจบโดย default จึงควรตั้ง AutoCommit mode เป็น false และเรียก commit() method หลังจากเรียกกลุ่มของ statement execute เอง และใช้ rollback() method ใน catch block เมื่อไหร่ก็ตามที่เกิด exception ขึ้นในโปรแกรม

ตัวอย่าง 
try{
connection.setAutoCommit(false);
PreparedStatement ps = connection.preareStatement( "UPDATE employee SET Address=? WHERE name=?");
ps.setString(1,"Austin");
ps.setString(2,"RR");
ps.executeUpdate();
PreparedStatement ps1 = connection.prepareStatement( "UPDATE account SET salary=? WHERE name=?");
ps1.setDouble(1, 5000.00);
ps1.setString(2,"RR");
ps1.executeUpdate();
connection.commit();
connection.setAutoCommit(true);
}catch(SQLException e){ connection.rollback();}
finally{
if(ps != null){ ps.close();}
if(ps1 != null){ps1.close();}
if(connection != null){connection.close();}
}

Statement vs PreparedStatement
เรามักเข้าใจผิดว่า PreparedStatement จะให้ประสิทธิภาพที่ดีกว่าเมื่อหยิบมาใช้งาน ความจริงแล้วใช่ว่าจะเป็นเช่นนั้น เมื่อเราใช้ PreparedStatement object เพื่อ execute SQL Statement มันจะถูก compile และเก็บไว้ใน cache และเมื่อเราเรียกใช้อีกมันจะไม่ถูก compile เป็นครั้งที่สอง เพราะมันจะถูกพบใน cache และนำกลับมาใช้ใหม่ ซึ่งเป็นการเพิ่มประสิทธิภาพการทำงานเพราะลดเวลา compileแต่เมื่อเราใช้ Statement ทุกครั้งที่เราจะ execute SQL Statement มันจะถูก compile ใหม่ทุกครั้งถ้าดูตามเหตุผลด้านบนนี้ PreparedStatement เหมาะสมกับการถูกนำมาใช้อย่างยิ่ง แต่ ความจริง ไม่ได้เป็นอย่างนั้น
เมื่อเราเห็นผลการทดสอบดังกล่าว จะสรุปได้ว่าสำหรับ enterprise application ที่มีผู้ใช้จำนวนมากที่จะ execute SQL statement เดียวกันบ่อยๆ การลดเวลา compile ได้สามารถช่วยเพิ่ม performance ให้กับ database ได้ แต่สำหรับ client-side การใช้ PreparedStatement ใช้เวลานานกว่า Statement
แต่ถึงอย่างไรถ้าเรากังวลกับเรื่องของ SQL injection PreparedStatement ก็จะเป็นตัวเลือกที่สมควรหยิบไปใช้

นอกจากนี้ยังมีอีกหลายประเด็นทีน่าสนใจเช่นเรื่องของ batch, pre-fetch value ที่ผมยังไม่มีเวลาสรุป ลองศึกษาเพิ่มเติมได้ครับ

Referenece:
http://oreilly.com/catalog/jorajdbc/chapter/ch19.html

No comments:

Post a Comment