วันพุธที่ 12 กุมภาพันธ์ พ.ศ. 2557

เมื่อ Connection Pool DataSource Tomcat 6.0 ไม่ได้

ในเรื่องการติดต่อ Database แบบ DataSource หรือ Pooling ของ Tomcat นั้นอาจจะมีปัญหาบางอย่างที่เรามั้งลืมมันนั้นคือ ต้องเอา Lib   JDBC ของ Database นั้นไปวางไวที่   path  /apache-tomcat-6.0.18/lib
เพื่อให้ Server รู้จัก lib ของ DB นั้น  ตัวอย่าง Error ที่มักเจอกรณีที่ลืมวาง lib  จะขึ้น Error ดังนี้เมื่อเรียกโปรแกรม

HTTP Status 500 -

--------------------------------------------------------------------------------

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.informix.jdbc.IfxDriver'
 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1136)
 org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
 crm.servlets.loginServlet.performTask(loginServlet.java:282)
 com.lh.servlet.BaseHttpServlet.doPost(BaseHttpServlet.java:37)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


root cause

java.lang.ClassNotFoundException: com.informix.jdbc.IfxDriver
 java.net.URLClassLoader$1.run(Unknown Source)
 java.security.AccessController.doPrivileged(Native Method)
 java.net.URLClassLoader.findClass(Unknown Source)
 java.lang.ClassLoader.loadClass(Unknown Source)
 java.lang.ClassLoader.loadClass(Unknown Source)
 java.lang.ClassLoader.loadClassInternal(Unknown Source)
 java.lang.Class.forName0(Native Method)
 java.lang.Class.forName(Unknown Source)
 org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1130)
 org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
 crm.servlets.loginServlet.performTask(loginServlet.java:282)
 com.lh.servlet.BaseHttpServlet.doPost(BaseHttpServlet.java:37)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
 javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.18 logs.


--------------------------------------------------------------------------------

Apache Tomcat/6.0.18

เมื่อเกิด Error ดังกล่าวข้างบนให้นำ  lib JDBC  ไปวางไว้ใน path ดังกล่าว แสดงดังภาพด้านล่าง
(for Database  Informix)



Basic Config Log4J

จะสอนวิธีใช้งานแบบง่ายๆ ของ Log4J นะครับ ว่าจะ Config ยังไงดี ซึ่งเราจะ Config ใน log4j.properties นะครับ Parameter ที่น่าจะรู้

log4j.rootCategory เป็นการกำหนด Log ทั้งหมดของเราว่าจะให้มีระดับเท่าไร ซึ่งใน Log4J จะมีระดับดังนี้ info, warn, debug and fatal
log4j.logger.package เป็นการกำหนดว่าจะให้ที่อยู่ในชื่นี้ทั้งหมดอยู่ในระดบไหน [ตรง Package ให้กำหนดเป็นชื่อหรือ Package ของ Class เราก็ได้ว่าจะให้มันอยู่ในระดับใดของ Log4J]
log4j.appender.package กำหนดว่าจะให้ Log ออกแบบไหน เช่นลงไฟลล์หรือเปล่า
log4j.appender.package.DatePattern เป็นรูปแบบของไฟลล์ว่าพอหมดวันแล้วจะเก็บรูปแบบไหน
log4j.appender.package.File กำหนัดว่าไฟลล์จะชื่ออะไร วางไว้ที่ไหน
log4j.appender.package.MaxFileSize ความจุมากสุดของในแต่ละไฟลล์ ถ้าในวันนึงเกินจะหั่นไฟลล์ออกมา
log4j.appender.package.layout จะให้ Pattern เป็นแบบไหน
log4j.appender.package.layout.ConversionPattern กำหนดรูปแบบว่าจะให้โชว์อะไรบ้าง


ข้างล่างเป็นตัวอย่าง อย่างง่ายๆ ครับ

log4j.rootCategory = Info, stdout //บอกว่าให้ Log ทั้งหมดที่ระดับต่ำกว่า Info ไม่ต้องเอามาแสดง ส่วน stdout คือ System.out
log4j.appender.stdout = org.apache.log4j.ConsoleAppender //เป็นการบอกว่าออกที่ Console
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout //Pattern
log4j.appender.stdout.layout.ConversionPattern = ...[ABC Project]... [%d{dd/MM/yyyy HH:mm:ss,SSS}] (%c:%L) - %5p - %m%n//รูปแบบของการออกโดย จะเป็นดังนี้ ... [ABC Project]... [รูปแบบของวันที่จะเป็น วัน/เดือน/ปี ชั่วโมง:นาที:วินาที,ไมโครวินาที] (ชื่อเต็มเช่น ชื่อ Class รวมกับ Package ทั้งหมด:บรรทัดที่รัน) - Level ของ Log 

log4j.logger.com.true_corp.connector = DEBUG,connectorlog //เป็นการบอกว่า Log ที่อยู่ใน Package com.true_corp.connector ทั้งหมดจะมีระดับ Log ที่ Debug แล้วตัวข้างหลังบอกว่าใช้เป็นตัวแปรชื่อนี้
log4j.appender.connectorlog = org.apache.log4j.DailyRollingFileAppender //กำหนดให้ connectorlog เก็บลงไฟลล์
log4j.appender.connectorlog.DatePattern = '.'yyyy_MM_dd //มีรูปแบบของวันเป็น ปี_เดือน_วัน
log4j.appender.connectorlog.File = C:/Connector.log //ลงไฟลล์ชื่อ Connector.log
log4j.appender.connectorlog.MaxFileSize = 10000KB //ขนาดไฟลล์สูงสุดคือ 10 Mb ถ้าเกินจะขึ้นไฟลล์ใหม่
log4j.appender.connectorlog.layout = org.apache.log4j.PatternLayout
log4j.appender.connectorlog.layout.ConversionPattern = ...[Temp Log]... [%d{dd/MM/yyyy HH:mm:ss,SSS}] (%c:%L) - %5p - %m%n