 |
|
อยากทราบหลักการเขียนโปรแกรมติดต่อ Database ไม่ให้เกิด Timeout ว่ามีหลักการอะไรบ้าง |
|
 |
|
|
 |
 |
|
ปกติ Process ถ้ามันทำงานได้ปกติ มันจะไม่ Timeout ครับ นอกจากจะ Query ช้า หรือว่าช้าตรงไหนซะอย่างครับ จะต้องอาศัยการ Debug ดูครับ
|
 |
 |
 |
 |
Date :
2012-04-25 12:59:21 |
By :
webmaster |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
จากโค้ดที่ผมให้ไป ปกติแล้ว ก็ไม่เกิด Timeout หลอกครับ
แต่ก็มีบางครั้ง ถึงเงื่อนไข query จะเหมือนเดิม แต่ก็ Timeout ซะดื้อ ๆ
ผมเลยค่อนข้างสงสัย
ว่าอาการช้า อาจนับร่วมในส่วนอื่นของโปรแกรม ที่นอกเหนือจากการคิวรี่ รึเปล่า
หรืออาจเกิดจากทรัพยากรของเครื่องด้วยรึเปล่า (เรื่องทรัพยากรนี้ผมคิดเล่นๆนะครับ ไม่รู้เกี่ยวป่าว)
ว่าแต่ปกติพี่ Mr.Win มีวิธีการแก้ไขอย่างไรครับ
ยกตัวอย่างเคสที่พี่เจอเป็นตัวอย่างให้ผมหน่อยครับ
|
 |
 |
 |
 |
Date :
2012-04-25 13:38:35 |
By :
plugantz |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
"Timeout expired"
เกิดได้ 2 กรณี
1. ปกติถ้าเขียนโปรแกรมแบบที่ไม่ได้ใช้ Threading จะทำให้ UI (User Interface) หยุดชงักหรือ "Non-Response"
เกิดจาก IDbConnection ทำการติดต่อไปยัง Server Database ด้วย Ip Address, Name Pipe etc... แล้วไม่มีผลกลับมา
วิธีทดสอบง่ายๆ ลองเปลี่ยน Datasource ใน Connection String เป็น IP Address ที่ไม่มีอยู่จริง ก็ Timeout Expired แล้วครับ
แต่จะรอนานๆ แล้วโปรแกรมก็จะเอ๋อๆ
วิธีแก้ คุณก็ใส่ Threading ซ่ะ แล้วก็ถ้าทดสอบ Ping Server ได้ก็ลอง Ping Server ดูก่อน ถ้าสามารถติดต่อ Server ได้ค่อยเปิด Connection Database
2. หากสามารถติดต่อ Database ได้ คือ สามารถ Open Connection ได้ จะเกิด Timeout Expired อีกครั้งคือกรณี เราเปิด
Connection นานเกินที่ Database Server Config ไว้ เช่น SQL Database จะ Default เปิด Connection ไว้ไม่ เกิน 30 วินาที
เป็นต้น เหตุผลที่เป็นเช่นนี้เพราะว่า Concurrent ของ Database มีจำนวนจำกัด คุณไม่สามารถเปิด Connection Database ทิ้งไว้แล้วไม่จัดการหรือสนใจกับมันได้ Open แล้วเลิกใช้ต้อง Close Connection เสมอ
วิธีแก้ ต้องถามว่าปัญหามันเกิดที่อะไร ถ้าเป็นที่ query คุณเองมันไม่ดี ก็ Optimize ซ่ะ ถ้าปัญหาเกิดจาก Coding คุณไม่ดี เปิด connection แล้วไม่ปิด ก็แก้ซ่ะ ใส่ Threading ด้วยก็ดีครับ โปรแกรมจะได้ไม่เอ๋อๆ แบบว่า Non-Response
ลองศึกษา Background Worker, using(), try...catch ด้วยครับแล้วมาปรับใช้กับการเขียนโปรแกรมของเรา
-Concurrent หมายถึง ความสามารถของ Server ที่สามารถรับ Connection ของ client ได้จำนวนเท่าใด
|
 |
 |
 |
 |
Date :
2012-04-26 15:45:53 |
By :
numenoy |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขอบคุณพี่ numenoy มากๆครับ
เป็นคำตอบที่แตกต่างจากที่ผมเคยอ่านมาจากหลายๆที่่
(หมายถึงค่อนข้างเชิงลึก)
ผมจะพยายามศึกษาตามที่พี่บอกให้เข้าใจ และจะลองแก้ดูตามความเข้าใจนะครับ 
|
 |
 |
 |
 |
Date :
2012-04-26 16:47:59 |
By :
plugantz |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|