Sunday, December 23, 2012

การสร้าง Datasource บน Tomcat

,

การสร้าง Datasource บน Tomcat

โดยปกติเราสามารถสร้าง Web Application ที่สามารถติดต่อกับฐานข้อมูลได้โดยตรง แต่ในทางปฏิบัติเราควรจะติดต่อฐานข้อมูลผ่านทาง Data source แทน เนื่องจากมีข้อดีกว่าได้แก่
  • สามารถกำหนดจำนวนการติดต่อได้
  • สามารถสร้าง connection pool ทำให้ใช้งานระบบได้อย่างมีประสิทธิภาพ
  • สามารถกำหนดกลุ่มผู้ใช้งานฐานข้อมูลได
ในบทความนี้จะกล่าวถึงการ setup data source และกำหนด connection pool บน Tomcat version 5.5.x พร้องทั้งแสดงตัวอย่าง web application ที่เรียกใช้ฐานข้อมูลผ่านทาง data source ในที่นี้ผู้เขียนสมมติว่าผู้อ่านได้ติดตั้ง Tomcat แล้ว โดยติดตั้งที่ใดก็แล้วแต่ ซึ่งผู้เขียนขอเรียกว่า TomcatHome ดังนั้นถ้าผู้เขียนกล่าวถึง TomcatHome ขอให้ผู้อ่านรู้ว่ากำลังกล่าวถึงตำแหน่งที่ผู้อ่านได้ติดตั้ง Tomcat นั่นเอง
เริ่มแรกขอให้ไปที่ TomcatHome/conf ให้ทำการสำเนาไฟล์ server.xml เป็นชื่อ serverold.xml จากนั้นเปิดไฟล์ server.xml ขึ้นมา แล้วทำการแก้ไขข้อความภายในโดยเพิ่มข้อความระหว่าง tag <Host> และ </Host> ให้เป็นดังนี้
      <Host name="localhost" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">

 <Context path="/test" docBase="test"
        debug="5" reloadable="true" crossContext="true">

   <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
        removeAbandoned="true" removeAbandonedTimeout="60"
               username="root" password="" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/your_database?autoReconnect=true"/>

 </Context>

      </Host>

ข้อความที่เพิ่มเข้ามาเป็นการสร้าง data source ที่ชื่อ jdbc/TestDB สำหรับ Application ที่อยู่ภายใน directory ชื่อ test ภายใต้ webapps ของ Tomcat ส่วนต่างๆมีความหมายดังนี้
maxActive เป็นการกำหนดจำนวนการติดต่อสูงสุดที่อนุญาตให้ใช้งานพร้อมกัน
maxIdle เป็นการกำหนดจำนวนสูงสุดของการติดต่อที่อยู่ในสภาวะ idle
maxWait เป็นการกำหนดเวลาสูงสุดที่รอการติดต่อ จากตัวอย่างข้างบนคือจะรอ 10 วินาที มิฉะนั้นก็จะแจ้งว่าเกิด timeout
removeAbandoned เป็นการกำหนดว่าถ้ามีการติดต่อใดอยู่ในสภาวะ idle นานเกินไปแล้วก็จะทำการยกเลิกการติดต่อออกไป
removeAbandonedTimeout เป็นการกำหนดเวลาที่จะพิจารณาในการยกเลิกการติดต่อ
จากตัวอย่าง ถ้ามีการ idle เป็นจำนวนเวลา 60 วินาที ก็จะถูกยกเลิกการติดต่อ เนื่องจากผู้เขียนใช้ฐานข้อมูลเป็น MySQL ดังนั้นจึงใช้ JDBC Driver และ URL ดังกล่าว
จากนั้นขอให้ผู้อ่านสร้าง directory ชื่อ test ภายใต้ webapps ของ TomcatHome โดยมีโครงสร้างดังนี้
 webapps
   |-----> test
  |------> test.jsp
  |------> WEB-INF
   |-----> web.xml
   |------> lib
    |-----> jstl.jar
    |-----> standard.jar

จากนั้นขอให้ผู้อ่านสำเนาไฟล์ ต่อไปนี้ไปไว้ใน TomcatHome/common/lib

  • Jakarta-Commons DBCP
  • Jakarta-Commons Collections
  • Jakarta-Commons Pool
  • JDBC Driver
ถ้าท่านใดไม่มีไฟล์ดังกล่าวข้างต้น สามารถดาวโหลดได้ ที่นี่ (ไม่รวม JDBC Driver)
ซึ่งผู้พัฒนาแนะนำว่าให้ติดตั้งไฟล์ดังกล่าวในที่นี้เท่านั้น โดยไม่แนะนำให้ติดตั้งใน WEB-INF/lib ซึ่งอาจเกิดปัญหาได้ จากนั้นให้แก้ไขไฟล์ web.xml ให้เป็นดังนี้
 <?xml version="1.0" encoding="ISO-8859-1"?>
 
 <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
     version="2.4">
   <description>MySQL Test App</description>
   <resource-ref>
       <description>DB Connection</description>
       <res-ref-name>jdbc/TestDB</res-ref-name>
       <res-type>javax.sql.DataSource</res-type>
       <res-auth>Container</res-auth>
   </resource-ref>
 </web-app>

ซึ่งเป็นการประกาศการนำ data source ที่เราได้สร้างแล้ว มาใช้ภายใน directory นี้นั่นเอง หลังจากนั้น เราสามารถสร้างโปรแกรมเพื่อทดสอบ data source ได้แล้ว โดยสร้างไฟล์ชื่อ test.jsp แล้วเพิ่มข้อความเข้าไปดังนี้ โดยขอให้แก้ไข sql query และชื่อ field ให้เหมาะสมกับตนเอง
 <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

 <sql:query var="rs" dataSource="jdbc/TestDB">
 select * from report
 </sql:query>
 <html>
   <head>
     <title>DB Test</title>
   </head>
   <body>
 
   <h2>Results</h2>
  
 <c:forEach var="row" items="${rs.rows}">
     ${row.product}   ${row.sell_amount}<br/>
 </c:forEach>
 
   </body>
 </html>

ซึ่งตัวอย่างนี้เป็นการเขียนโดยใช้ JSTL จากนั้นให้เรา start Tomcat แล้วเรียกโปรแกรมนี้ผ่าน Browser เช่น
http://localhost:8080/test/test.jsp

ก็จะได้ผลลัพธ์ตามต้องการ
สุดท้ายนี้หวังว่าบทความนี้คงเกิดประโยชน์แก่ท่านไม่มากก็น้อย หากมีข้อสงสัยใดสามารถสอบถามได้ที่เว็บบอร์ด

1 comments:

  • This comment has been removed by the author.
    August 24, 2015 at 7:02 PM
    MSRTT says:

    This comment has been removed by the author.

Post a Comment

 

Java Servlet Copyright © 2012 | Design by I Love Linux