เลือก Driver ให้เหมาะกับงานที่กำลังทำอยู่
JDBC สร้าง driver ออกมาสี่ประเภทขึ้นอยู่กับความต้องการที่เราจะต้องเลือกไปใช้
เลือกที่จะควบคุม transaction เอง
java.sql.Connection interface เตรียม method เพื่อจัดการกับ transaction ดังนี้
ตัวอย่าง
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();
ตัวอย่าง
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
เรามักเข้าใจผิดว่า 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