SQL Performance Tuning
การเขียน SQL แต่ละแบบที่ให้ผลลัพธ์เหมือนกัน แต่ performance อาจจะไม่เท่ากัน ศึกษาได้จากเล่มนี้ครับ
Log4j Guide
ปกติเวลาเขียน java ถ้าอยากดูค่าตัวแปรก็มักจะใช้ System.out.println ให้แสดงผลออกมาทาง console
ตอนที่ Develop ก็ง่ายดีอ่ะนะ แต่พอเอาไปใช้งานจริงกับ App Server ก็ไม่ได้ช่วยอะไรดูผลอะไรก็ยาก
บางคนก็เขียน class เก็บ log file เอาเองแบบเขียนลง file ได้เป็นพอ ก็ช่วยได้บ้าง
แต่จริงๆแล้วควรมีการเก็บ log การทำงานของโปรแกรมให้เป็นระบบหน่อย ลองดูๆก็มาเจอLog4j ของ Apache ที่ดูเข้าท่าดี
Log4j เป็น class library ที่ไว้จัดการกับ Log โดยปกติแล้วจะมี Console, File, Database และ E-Mail แต่ก็สามารถเขียนเพิ่มเติมเองได้
Level ของ Log จะแบ่งเป็น 5 Level ตามนี้(จากต่ำไปสูง)
- Debug
- Info
- Warn
- Error
- Fatal
โดย Level ที่สูงกว่าจะเขียน Log ของ Level ต่ำกว่าติดมาด้วย
ใน code ของเราก็จะมีการเขียน logging โดยไม่ต้องสนใจว่าจะ log level ไหน ให้เขียนตามสะดวก แล้วค่อย set properties file ให้เก็บ log ที่ level ไหน
วิธีใช้งาน Log4j ก่อนก็ต้องไป download log4j มาจาก Apache log4j ก่อน แล้ว add log4j.jar เข้ามาใน project
ตัวอย่าง code
import org.apache.log4j.Logger;
public class LogClass {private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class);
public void getI(){};
public static void main(String[] args) {log.debug(“Debug”);
log.info(“Info”);
log.warn(“Warn”);
log.error(“Error”);
log.fatal(“Fatal”);
try{LogClass clz=null;
clz.getI();}
catch(Exception ex){log.error(“Error Performing Operation”,ex);}}
}
ต่อไปต้องมีการสร้าง file configure ซึ่งจะเป็นในแบบ Properties หรือเป็น XML ก็ได้ แล้วแต่ความถนัด เพื่อจะกำหนดค่าต่างๆของการ write log โดยถ้าไม่ได้สั่ง load file configure ก็จะใช้ file ชื่อ log4j.properties ดังตัวอย่าง
### file appender
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=’.'yyyy-MM-dd
log4j.appender.file.File=/test.log
log4j.appender.file.threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L – %m%nlog4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.SimpleLayout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L – %m%nlog4j.rootLogger=Debug, file, stdout
จะเป็นการเก็บ log ใน File ชื่อ test.log และแสดงผลออกมาทาง console โดยมี Pattern แบบนี้
23:43:21,968 DEBUG LogClass:29 – Debug
23:43:21,968 INFO LogClass:29 – Info
23:43:21,968 WARN LogClass:29 – Warn
23:43:21,968 ERROR LogClass:29 – Error
23:43:21,968 FATAL LogClass:29 – Fatal
Pattern การแสดงสามารถตั้งค่าได้ที่ layoutใConversionPatternโดยมีค่าตามนี้
#%c Logger, %c{2 } last 2 partial names
#%C Class name (full agony), %C{2 } last 2 partial names
#%d{dd MMM yyyy HH:MM:ss } Date, format see java.text.SimpleDateFormat
#%F File name
#%l Location (caution: compiler-option-dependently)
#%L Line number
#%m user-defined message
#%M Method name
#%p Level
#%r Milliseconds since program start
#%t Threadname
#%x, %X see Doku
#%% individual percentage sign
#Caution: %C, %F, %l, %L, %M slow down program run!
เราสามารถ Load file configure ได้ตามนี้
PropertyConfigurator.configure(“c:\\data\\config\\log4j.properties”);
เขียน ex.printStackTrace(); ลง log
log.error(“Error Performing Operation”,ex);
WebSphere Class Load Policy
WebSphere เครื่องที่ไว้ใช้ UAT เกิดปัญหา ClassNotFoundException ทั้งๆก็เห็นอยู่ว่ามี Class นั้นอยู่ใน Application ที่ Deploy ลงไป
ก็หากันอยู่ครึ่งค่อนวัน ลองโน่นลองนี่ จนสุดท้ายน้องมันไปเจอ Property อยู่ตัวหนึ่งในไม่เหมือนกับเครื่อง Develop ชื่อ Class Load Policy ในหน้า Server Configure พอเห็นค่าที่ต้อง Set ก็คิดว่าน่าจะเกี่ยว เพราะค่าที่มีให้เลือกคือ Single กับ Multiple โดยที่เครื่อง UAT set เอาไว้เป็น Single
ปกติ Application ที่ Deploy ก็ไม่ได้ยุ่งเกี่ยวกัน มีการใช้ class ซ้ำๆกัน แต่ก็แยกกันไปคนละที่ ซึ่งถ้า set Class Load Policy ไว้เป็น Single ก็น่าจะทำให้ WebSphere เกิดอาการร่วนขึ้น เพราะ Class ใช้เหมือนๆ (package ยังที่เดียวกันซะอีก)
สรุปพอ set ค่าเป็น Multiple แล้ว อาการร่วนต่างๆก็หายไป
WebSphere share library
First step is create directory of shared libraries on WebSphere’s Server
- Export library class to Jar file
- Ftp library file to server
The next step is create Shared Libraries in WebSphere
- From Environment menu, choose Share Library
- WebSphere will Shared Libraries Screen, then click New
- Input Name, Description and Class Path of jar file and click OK
- Save configure to server
The next step is set Shared Library to Application
- Form Application Menu, choose Enterprise Applications
- Select Application for assign Share Library
- In Application Configuration at Additional Properties topic, click Libraries
- WebSphere will show Library Reference, then click Add
- Select Library and click OK
- Save configure to server and Restart Application
- Application will include share library, finish
Execute Dynamic SQL in DB2 Store Procedure
วิธีการสร้าง SQL Statement ใน Store Procedure ของ DB2 และ Return Cursor ออกมา สามารถทำได้ตามนี้
CREATE PROCEDURE SP_COUNT_ROW( IN pTblName VARCHAR(50) )
RESULT SET 1
LANGUAGE SQL
BEGINDECLARE vTmp VARCHAR(200);
DECLARE vStmt statement;DECLARE c1 CURSOR WITH RETURN FOR vStmt;
SET vTmp = ‘SELECT count(*) as RowCount,’||pTableName||’ as TblName ‘||FROM ‘|| pTblName ;
prepare vStmt from vTmp;OPEN c1;
END
จากตัวอย่างเป็นการส่งชื่อ Table มาทำการ Count หา Row ที่มีอยู่ ผลลัพธ์ได้จะมีเป็น
call SP_COUNT_ROW(‘CUSTOMERS’)
RowCount TableName
———– ———————
332,456 CUSTOMERS
ที่น่าแปลกใจก็คือมี Type variable “Statement” ด้วยเรอะ
VB.Net Power Coding
วันนี้เอาหนังสือมาฝากครับ
ตอนนี้ Project ใช้ VB.Net อยู่เลยหาหนังสือมาดูเพิ่มเติม จากมีตอนเคยเขียน VB6เมื่อนานมาแล้ว
เล่มนี้ไม่ได้สอนเขียน VB.Net แต่เป็น ส่วนเน้นๆ ของการทำงาน หลายๆเรื่องก็ไม่รู้ว่าเขียนกันยังนี้ไ้ด้ด้วย