วันพฤหัสบดีที่ 29 กรกฎาคม พ.ศ. 2553

ตัวอย่าง code Gen UUID แบบที่1

บางครั้งเราต้องการใช้ค่าจาก system ที่ gen auto id ไม่ซ้ำกัน หรือเรียกกันว่า unique identifier (uuid)
ตัวอย่าง code ที่สามารถใช้งานได้ตามข้างล่าง
**************************************************

//output :6f5c9761-4728-4cf6-aace-0321f0027bcf ก็จะประมาณนี้
package com.test.test;

import java.util.Locale;
import java.util.Random;

/**
* A simple UUID.
*/
public final class UUID
{
public static void main(String args[])
{

System.out.println(nextUUID());
}
/**
* The characters to generate this UUID with.
*/
private static final char[] HEX = new char[] {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'
};

/**
* Index into the UUID to set its type.
*/
private static final byte INDEX_TYPE = 6;

/**
* Index into the UUID to set its variation.
*/
private static final byte INDEX_VARIATION = 8;

/**
* The specific type of the UUID.
*/
private static final byte TYPE_RANDOM_BASED = 4;
/**
* The rnd generator.
*/
private static final Random RANDOM = new Random();

/**
* The string representing this UUID.
*/
private final String uuid;

/**
* Constructs a new UUID with the specified bytes.
*/
private UUID(byte[] bytes) {
this.uuid = genString(bytes);
}

/**
* Constructs a new UUID with the specified string.
*
* The size of the string must be 32, but no other characters
* are checked.
*/
public UUID(String uuid) {
this.uuid = uuid.toLowerCase(Locale.US);
if(uuid.length() != 36)
throw new IllegalArgumentException();
}

/**
* Returns the next UUID.
*/
public static UUID nextUUID() {
byte[] bytes = new byte[16];
RANDOM.nextBytes(bytes);
bytes[INDEX_TYPE] &= (byte) 0x0F;
bytes[INDEX_TYPE] |= (byte) (TYPE_RANDOM_BASED << sb =" new" i =" 0;" i="="4" i="="6" i="="8" i="="10)" hex =" info[i]">> 4]);
sb.append(HEX[hex & 0x0F]);
}
return sb.toString();
}

/**
* Generates the string of this UUID.
*/
public String toString() {
return uuid;
}

/**
* Determines if this UUID is the same as another.
*/
public boolean equals(Object o) {
if(o == this)
return true;
else if (o instanceof UUID) {
UUID other = (UUID)o;
return uuid.equals(other.uuid);
}
return false;
}

/**
* The hashCode of this UUID.
*/
public int hashCode() {
return uuid.hashCode();
}
}

ปัญหา java call Function return type boolean ใน oracle

สำหรับคนที่เคยใช้ ฐานข้อมูล oracle คงหนีไม่พ้นเรื่องการเขียน pl/sql ซึ่งก็เป็นจุ่นเด่นของ oracle เค้าว่าอย่างนั้น แต่มีนักพัฒนาไม่น้อยที่
ไม่จำเป็นต้องรู้จักหรือต้องเรียนรู้การเขียน pl/sql รู้แต่เพียงว่าเรียกใช้ procedure/function pl/sql เท่านั้น
ปัญหาอย่างหนึ่งระหว่าง java กับ oracle คือการเรียกใช้ function ใน oracle ที่มี Return type เป็น boolean ซึ่งเค้าว่ากันว่า java ยังไม่ support
การเรียกใช้ Return type ที่เป็น boolean นี่อาจเป็นวิธีทางแก้อีก หนึ่งทางเลือกสำหรับนักพัฒนาคือการเขียน pl/sql ครอบระหว่างการเรียนใช้ function ของ orcle
ซึ่งในตัวอย่างประกอบไปด้วย
1. pl/sql function ที่ return ค่าเป็น boolean
2. การเรียกใช้โดยใช้ java

--สร้าง ประกาศ function และสร้าง package
create or replace
PACKAGE PKG_TEST AS
FUNCTION F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2) RETURN BOOLEAN;
END PKG_TEST;

/***********************************************/
--สร้าง body และสร้าง function F_GET_TEST_BOOL โดย return type ที่เป็น boolean
create or replace
PACKAGE BODY PKG_TEST AS
FUNCTION F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2)
RETURN BOOLEAN AS
B_RESULT BOOLEAN := TRUE;
BEGIN
IF P_SALARY1>1500 THEN
P_SALARY2 := 'salary1 > 1500 bath';
ELSE
P_SALARY2 := 'salary1 < 1500 bath';
B_RESULT := FALSE;
END IF;
RETURN B_RESULT;
END F_GET_TEST_BOOL;

END PKG_TEST;

//เรียกใช้ จากโดย java set parameter in,out,และ return type

package com.test;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;

public class TEST_CALL_FBOOL {
//สร้าง connection method เพื่อ connec oracle
private static Connection conn()
{
String conStr;
Connection conn;
try
{
//สร้าง url connection
conStr = "jdbc:oracle:thin:@localhost:1521:orcl";
//register class dirver
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
//connection & return
return conn = DriverManager.getConnection(conStr, "system", "root");
}
catch(Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//การเรียนใช้
P_CALL_FUNCTION_BOOL();
}

//สร้าง method สำหรับ เรียกใช้ fuction PL/SQL
public static void P_CALL_FUNCTION_BOOL()
{
//ประกาศ call prepared
CallableStatement cstmt = null;
//ประกาศ connection
Connection conn = null;
try {
//connection
conn =conn();

// -------------------------------------------------------------
// Call PL/SQL Function to retrieve {?= call function(?,?...n)}
// -------------------------------------------------------------
//F_GET_TEST_BOOL(P_SALARY1 IN NUMBER, P_SALARY2 OUT VARCHAR2)
//วิธีแก้ไขสำหรับการเรียน function จาก pl/sql ที่มี return type เป็น boolean เราจะทำการเขียน pl/sql คลอบ function ที่ต้องการเรียกใช้
//และมีการ return type เป็น varchar แทน ในตัวอย่าง ประกาศ ตัวเเปรที่ชื่อ B_VAL เป็น boolean เพื่อรับค่าจาก function ที่ return type เป็น boolean
//โดย function มี argument ที่เป็น IN(P_SALARY1) และ OUT(P_SALARY2) จากนั้น ก็ทำการ check if B_VAL เป็นจริงหรือไม่ ถ้าเป็นจริงให้ ตัวแปร ? มีค่าเป็น "T" String เพื่อ Return
//ค่าให้ java ใช้งาน

// prepared call
cstmt = conn.prepareCall("DECLARE B_VAL BOOLEAN; " +
"BEGIN B_VAL := PKG_TEST.F_GET_TEST_BOOL(?,?);" +
"IF (B_VAL) THEN ? := 'T'; END IF; END;");

//register input parameters
cstmt.setInt(1,1000);

//register output parameters
cstmt.registerOutParameter(2, OracleTypes.VARCHAR);

//register Return type
cstmt.registerOutParameter(3, OracleTypes.VARCHAR);

// Execute and retrieve the returned values
cstmt.execute();

System.out.println("******************************************8");

String result1 = cstmt.getString(2); //OUT parameter
String result2 = cstmt.getString(3); //Return type เื่พื่อทำไป check แล้วใช้งานต่อไป(ที่ได้จากการเรียก function)
//หมายเหตุ ถ้าเป็น True จะได้ String = 'T' แต่ถ้าเป็น False มีค่าเป็น null

System.out.println("Result Output param:"+result1);
System.out.println("Result Return Type:"+result2);

//close
cstmt.close();
conn.close();
}
catch (SQLException e)
{
System.out.println("'ERROR':"+e.toString());
}
}
}

ตัวอย่างสำหรับการเรียกใช้ function ของ pl/sql ที่มีการ Return type เป็น boolean โดยใช้ ภาษา java

Get วันทีปัจจุบันโดยใช้ java.util.date ตาม format

ในการเขียนโปรแกรมทุกภาษาสิ่งที่โปรแกรมเมอร์หลีกเหลี่ยงไม่พ้นคือการที่ต้องไปยุ่งเกี่ยวกับ วันเวลา วันที่ เดือน หรือ calendar ซึ่งในตัวอย่างนี้คือการนำค่าวันที่ปัจจุบันมาใช้งานตาม format (ซึ่งจริงๆมีหลายวิธีที่ได้มาซึ่งวันที่ปัจจุบัน)ดูตัวอย่างใน code ด้านล่าง
package com.test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class TestDate2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//กำหนด format
String format = "yyyyMMdd";

//เรียกใช้
System.out.println("Current System Date is :"+getSystemDate(format));
}
//ประกาศ method สำหรับ return ค่าวันที่ปัจจบัน หรือ system date โดยรับ argument เป็น String format เช่น yyyyMMdd,yyyy-MM-dd
public static String getSystemDate(String format) {
try
{
//ประกาศและสร้าง instance dateFormat
DateFormat dateFormat = new SimpleDateFormat(format,Locale.US);
//ประกาศและสร้าง instance Date
Date date = new Date();
//return date String ที่มีการกำหนด format แล้ว
return dateFormat.format(date).toString();
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}

แค่นี้ก็ได้วันที่ในแบบ format ที่ต้องการ

วันพฤหัสบดีที่ 3 มิถุนายน พ.ศ. 2553

Tomcat JNDI Datasource:use MySQL [pooling by application server] แบบงงๆ

- ในส่วนของ JNDI ก็สามารถทำได้หลายวิธีก็แล้วแต่ว่าจะให้เป็น Server Pool (ใช้ร่วมกันกับทุก application) หรือ เฉพาะ application pool ซึ่งคล้ายกัน
แต่จะใช้ได้เฉพาะ Application ตัวที่เรา config ไว้เท่านั้น

สำหรับการ config Server pool และ App pool ต่างก้นที่ตำแหน่งการเก็บของ context.xml ซึ่งเป็น config file

#-สำหรับ Server pool แก้ไขไฟล์ context.xml ที่ $TOMCAT_INSTALL_PATH/conf/ อันนี้จะไม่กล่าวถึงครับ


-สำหรับ App pool ให้เพิ่มไฟล์ context.xml ที่ $META-INF/
แก้ไข tag ดังนี้
-สำหรับ App pool ให้เพิ่มไฟล์ context.xml ที่ $META-INF/
แก้ไข tag ดังนี้
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/web-app" docBase="web-app" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/Datasource_DBPerson" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db_person"/>
</Context>


-แก้ไข web.xml ที่ WEB-INF
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Datasource_DBPerson</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

code เรียกใช้งานที่เป็น servlet
Connection m_connection = null;
try
{
String jndi_name = "jdbc/Datasource_DBPerson" ;
// Use JNDI
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup(jndi_name);
m_connection = ds.getConnection();
System.out.println("JNDI WORKS!..........") ;
PreparedStatement stmt = m_connection.prepareStatement("select * from person_test" );
ResultSet rs = stmt.executeQuery();
System.out.println( "

Web nerds:

" );
while (rs.next())
{
System.out.println( "

" + rs.getString( "fname" ) +" is a Web Nerd.

" );
}
rs.close();

m_connection.close() ;
}
catch (SQLException se)
{
System.out.println("SQL Error : "+ se.toString());
}
catch (Exception ne)
{
System.out.println("Other Error : "+ ne.toString());
}

อย่าลืมนำ jar (mysql-connector-java-5.0.7-bin.jar สำหรับ mysql 5.0 ขึ้นไป) ไฟล์สำหรับติดต่อ database ไปวางไว้ที่ WEB-INF/lib/
ด้วยน่ะคับ

อ้างอิง: http://gotoknow.org/blog/naidherng/289144


วันอังคารที่ 18 พฤษภาคม พ.ศ. 2553

ปัญหาเรื่อง Sun Java™ System Application Server Platform Edition 8.2 เกิด Error "org.apache.commons.discovery.jdk.JDKHooks."

ปัญหาเรื่อง Sun Java™ System Application Server Platform Edition 8.2 เกิด Error "org.apache.commons.discovery.jdk.JDKHooks." ตามข้างล่าง เกิดจาก App server ไม่สามารถเข้าถึง เป็นปัญหาเรื่อง permission ของ JDK
Environment:
-JDK 1.4_2
-SunAppServer 8.2

[#|2010-05-18T13:25:50.546+0700|SEVERE|sun-appserver-pe8.2|javax.enterprise.system.container.web|_ThreadID=20;|StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
java.lang.ExceptionInInitializerError
at org.apache.commons.discovery.jdk.JDKHooks.(JDKHooks.java:75)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:412)
at org.apache.commons.discovery.tools.DiscoverSingleton.find(DiscoverSingleton.java:378)
at org.apache.axis.components.logger.LogFactory$1.run(LogFactory.java:45)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.axis.components.logger.LogFactory.getLogFactory(LogFactory.java:41)
at org.apache.axis.components.logger.LogFactory.(LogFactory.java:33)
at org.apache.axis.handlers.BasicHandler.(BasicHandler.java:43)
at org.apache.axis.client.Service.getAxisClient(Service.java:104)
at org.apache.axis.client.Service.(Service.java:113)
at com.mfec.web.ws.WebService.verifyCreditCardProcess(WebService.java:38)
at com.mfec.web.struts.action.CreditCardInputAction.execute(CreditCardInputAction.java:347)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:767)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)
at sun.reflect.GeneratedMethodAccessor117.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:500)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:257)
at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:161)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:263)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:173)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:132)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:551)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:933)
at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:189)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.doProcess(ProcessorTask.java:604)
at com.sun.enterprise.web.connector.grizzly.ProcessorTask.process(ProcessorTask.java:475)
at com.sun.enterprise.web.connector.grizzly.ReadTask.executeProcessorTask(ReadTask.java:371)
at com.sun.enterprise.web.connector.grizzly.ReadTask.doTask(ReadTask.java:264)
at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:281)
at com.sun.enterprise.web.connector.grizzly.WorkerThread.run(WorkerThread.java:83)
Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:269)
at java.security.AccessController.checkPermission(AccessController.java:401)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:524)
at java.lang.SecurityManager.checkCreateClassLoader(SecurityManager.java:586)
at java.lang.ClassLoader.(ClassLoader.java:210)
at org.apache.commons.discovery.jdk.PsuedoSystemClassLoader.(PsuedoSystemClassLoader.java:73)
at org.apache.commons.discovery.jdk.JDK12Hooks.findSystemClassLoader(JDK12Hooks.java:215)
at org.apache.commons.discovery.jdk.JDK12Hooks.(JDK12Hooks.java:73)
... 48 more
|#]

วิธีแก้ปัญหา: ให้ทำการแก้ไข permision ของ "java.policy"
path : C:\Program Files\Java\j2sdk1.4.2_04\jre\lib\security ให้ทำการ grant permision โดยเพิ่ม data เข้าไปดังนี้
.....
// start add by pradoem 20100518 sun app 8.2
permission java.lang.RuntimePermission "createClassLoader";
permission java.lang.RuntimePermission "getClassLoader";
permission java.util.PropertyPermission "org.apache.commons.discovery.log.level", "read";
permission java.util.PropertyPermission "axis.EngineConfigFactory","read";
permission java.util.PropertyPermission "org.apache.axis.EngineConfigurationFactory" ,"read";
permission java.util.PropertyPermission "axis.ClientConfigFile","read";
permission java.util.PropertyPermission "axis.ServerConfigFile","read";
permission java.util.PropertyPermission "axis.xml.reuseParsers","read";
permission java.util.PropertyPermission "axis.attachments.implementation","read";
//end
.........
จากนั้นทำการ Restart Application Server ครับก็จะไม่เกิด Errors ดังกว่าแล้วครับ

วันจันทร์ที่ 19 เมษายน พ.ศ. 2553

ผ้าป่าสามัคคีระหว่างวันที่ 11-16 เมษา ทอด ณ วัดบ้านโพนไฮ มุกดาหาร

เริ่มจากวันอาทิตย์ที่ 11 เมษายน 53 เวลา 16 นาฬิกาหลังจากที่นัดชุมนุมประชุมกันเรื่องการจัดทำผ้าป่าสามัคคีเพื่อสมทบทุนสร้างอุโบสถ วัดบ้านโพนไฮ ต.หนองแคน อ.ดงหลวง จ.มุกดาหาร
(บ้านเกิดผมเองครับ 55) หลังจากที่มีการพูดคุยกันและได้มีการบอกกล่างขออนุโมทนาบุญจากเพื่อนๆที่ทำงาน เพื่อนๆของเพื่อนของเพื่อนอีกที ก็มีสายผ้าป่าทั้งหมด 34 สาย บางสายก็มีกรรมการน้อยบางสายก็มีกรรมการเยอะคละกันไป ซึ่งได้มีการรวบรวมเพื่อจัดพิมพ์ซอง ดังนี้ ประธานกรรมการ จำนวน 40 คน รองประธาน จำนวน 42 คน คณะกรรมการ อีก 1260 คน และซองเล็กอีก 1175 รวมซองทั้งหมด 2517 ซอง
แล้วก็นำไปแจกจ่ายตามสายต่างๆที่รับผิดชอบ แล้วก็ตามเก็บซองที่แจกไปเพื่อรวบรวมนำไปอนุโมทนาบุญ
ทางคณะผู้จัดทำก็ได้ลงมติกันว่าปีนี้คนกลับบ้านกันเยอะก็เลยได้จัดรถทัวว์สำหรับคณะผ้าป่า ซึ่งรถจอดรับสองจุด จุดแรกคือ lotus อ่อนนุช จุดที่สองคือ วงเวียนใหญ่ หลังจากนั้นรถก็เริ่มเิิดินทางออกจากกรุงจากจุดที่สองคือจุดวงเวียนใหญ่ออกทางปิ่นเกล้า ไปบางบัวทองมุ่งไปมุกดาหาร เวลาออกประมาณ 5.30 น. สำหรับที่นั่งไม่เต็มครับเหลือหลายที่มาก ตลอดระยะเวลาการเดินทางกลับก็ต้องจอดรถเป็นระยะๆเพื่อทำธุระส่วนตัว ก็เฮฮาปาตี้ตามประสาเพื่อนฝูงที่ไม่ได้เจอกันนาน กว่าจะเดินทางถึงบ้านเวลาประมาณ 9.50 น.ของวันที่ 12 ซึ่งทางบ้านก็ได้มีการต้อนอย่างดีเป็นการรับผ้าป่าที่อบอุ่น ก็มีการเรียนเชิญรับประทานอาหารเครื่องดื่มต่างๆจากนั้นทางคณะผ้าป่าทั้ง 41 คนก็พักผ่อนตามอรรถยาศัยบางคนก็กลับไปเจอหน้าพ่อหน้าแม่บางคนก็ไปเต้นรำวงที่ทางบ้านเค้าจัดให้เป็นรำวงสามัคคีเพื่อต่อยอดผ้าป่าในครั้งนี้

จากกำหนดการวันที่ 13 คือวันถวายต้นผ้าป่า ตอนเช้าทางคณะผ้าป่าได้มีการนัดรวมตัวกันซึ่งทางชาวบ้านได้มีการแห่กองยาวและฟ้อนภูไท ตอนรับคณะผ้าป่าในครั้งนี้ก็ม่วนซื่น ตั้งแต่เด็กเล็ก พ่อแก่แม่ม่ายต่างๆก็มาร่วมแห่ต้อนผ้าป่าด้วยกัน ก็เป็นประเพณีอีกอย่างหนึ่งบรรยากาศสนุกๆสนานมากครับพอถึงวัดก็แห่รอบวัดอีกสามรอบ จากนั้นทางคณะผ้าป่าและชาวบ้านก็เข้าไปทำพิธีสวดมนต์ไหว้พระและต่อยอดผ้าป่าสามัคคีเพื่อถวายต่อไป สำหรับพิธีการก็มีต่อยอดไหว้พระ รับศีล แล้วก็ถวายภัตาหารแด่พระภิกษุสงฆ์ แล้วจากนั้นจึงถายต้นผ้าป่า ยอดรวมหลังจากหักค่าใช้จ่ายแล้วได้ยอด 190100.50 บาท เส็ดแล้วก็มีการรับประทานอาหารร่วมกันช่วงบ่ายได้มีการรดน้ำดำหัวผู้ใหญ่เพื่อขอพร จากผู้เฒ่าผู้แก้ในหมู่บ้าน ก็สนุกสนานทั้งเด็กและผู้ใหญ่จากนั้นช่วงบ่ายแก่ๆได้มีกิจกรรมกีฬา ฟุตบอล แม่บ้าน-ก็ทีมเยาวชนหญิง ต่อด้วยทีมหมู่บ้านชาย กับทีมจากกรุงเทพ เป็นกิจกรรมเพื่อกระซับความสามัคคีกัน จากนั้นก็แยกย้ายกันทำธุระส่วนตัว

วันที่ 16 ก็นัดรวมตัวกันแล้วก็นำรถผ้าป่า เดินทางกลับกรุงเทพฯ

ก็ทั้งสนุกทั้งเหนื่อยสำหรับงานนี้ครับแต่ก็ผ่านไปได้ด้วยดี ^_^

วันพฤหัสบดีที่ 1 เมษายน พ.ศ. 2553

tomcat use connection pool with msyql

java use apache DBCP connection pooling with mysql Database
create connection pool โดย Database Connection Pool (DBCP) Configurations
environment:
#tomcat 5.5.x
#Eclipse IDE 3.2 or hiher
#MySQL 5.0.x
#jdk 1.5 or hiher

library request :
jdbc mysql connection j :->>mysql-connector-java-5.0.7-bin.jar find download on internet
apache dbcp commons-dbcp-current-bin :->>commons-dbcp-1.4.jar find downloa on internet

step #1:
create your own 'context.xml' file and put in your app_namexxx/META-INF/ location

<Context path="/web-app-pooling" docBase="web-app-pooling" debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/Datasource_DBPerson" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="root" password="root" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/db_person"/>

</Context>
Context path= web application name
docBase = web application name

step #2
เพิ่ม tag resource เข้าไปในไฟล์ web.xml (app_namexxx/WEB-INF/)
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/Datasource_DBPerson</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
step #3
ให้นำเอาไฟล์ mysql-connector-java-5.0.7-bin.jar ไปวางไว้ที่ TOMCAT_HOME/common/lib/ เพื่อให้ webapp server โหลดและทำงาน
ส่วนไฟล์ commons-dbcp-1.4.jar ให้ add เข้าไปใน lib ตามมปรกติ (app_namexxx/WEB-INF/lib/)

step #4
เรียกใช้งาน ผ่าน connection pooling สร้างไว้ดังนี้
javax.naming.InitialContext context = new InitialContext();
// Look up the data source
javax.sql.DataSource dataSource =(javax.sql.DataSource)context.lookup ("java:comp/env/jdbc/Datasource_DBPerson");
// Get a connection from the pool
java.sql.Connection conn = dataSource.getConnection();

PreparedStatement stmt = conn.prepareStatement("select * from person_test" );
ResultSet rs = stmt.executeQuery();

while (rs.next())
{
System.out.println("id:"+rs.getString("id"));
System.out.println("fname:"+rs.getString("fname"));
System.out.println("email:"+rs.getString("email"));
.......
}
rs.close();
conn.close();
}
catch ( javax.naming.NamingException e )
{
e.printStackTrace();
}
catch ( java.sql.SQLException e )
{
e.printStackTrace();
}

======END =======
test for you

** หมายเหตุสร้าง project โดยใช้ Eclipse IDE

เพิ่มเติม:http://forums.sun.com/thread.jspa?threadID=639243