ASP Lecture Series (9) การตั้งค่าขอบเขตวัตถุ
ผู้เขียน:Eve Cole
เวลาอัปเดต:2009-05-30 19:59:07
ขอบเขตของออบเจ็กต์จะกำหนดว่าสคริปต์ใดสามารถใช้ออบเจ็กต์ได้ ตามค่าเริ่มต้น เมื่อคุณสร้างอินสแตนซ์ของวัตถุ วัตถุนั้นมีขอบเขตของหน้า คำสั่งสคริปต์ใดๆ ภายในเพจ ASP เดียวกันสามารถใช้ออบเจ็กต์ที่กำหนดขอบเขตเพจได้ วัตถุจะถูกเผยแพร่เมื่อเพจ ASP ถูกส่งกลับไปยังไคลเอนต์ สำหรับออบเจ็กต์ส่วนใหญ่ ขอบเขตที่แนะนำคือขอบเขตของหน้า คุณสามารถเปลี่ยนขอบเขตของออบเจ็กต์เพื่อให้สคริปต์นำไปใช้ในหน้าอื่นได้ หัวข้อนี้อธิบายวิธีการใช้ออบเจ็กต์ขอบเขตหน้าและวิธีการเปลี่ยนขอบเขตของออบเจ็กต์
การใช้ออบเจ็กต์ขอบเขตหน้า ออบเจ็กต์ที่สร้างด้วย Server.CreateObject บนเพจ ASP จะมีอยู่ตลอดอายุการใช้งานของเพจ ออบเจ็กต์สามารถเข้าถึงได้ด้วยคำสั่งสคริปต์ใดๆ สำหรับเพจ และจะถูกปล่อยออกมาเมื่อ ASP ประมวลผลเพจเสร็จแล้ว ดังนั้นออบเจ็กต์จึงมีขอบเขตหรืออายุการใช้งานของเพจ
เมื่อเขียนโปรแกรมด้วย Visual Basic หรือ VBScript ระวังอย่าปล่อยวัตถุจนกว่า ASP จะเสร็จสิ้นการประมวลผลเพจ ตัวอย่างเช่น คำสั่งต่อไปนี้มักใช้เพื่อทำให้วัตถุว่างโดยการกำหนดค่าตัวแปรวัตถุเป็น Nothing:
ตั้งค่า myObj = ไม่มีเลย
หากคุณรวมคำสั่งนี้ไว้ในเพจ ASP ความพยายามใดๆ ในการใช้ myObj จะส่งกลับรหัสข้อผิดพลาดที่คาดไว้ แต่ภายใน ASP ยังคงรักษาการอ้างอิงไปยังวัตถุแม้ว่าจะถูกนำออกใช้แล้วก็ตาม เมื่อคุณไม่สามารถใช้วัตถุในสคริปต์ ทรัพยากรของวัตถุจะไม่ถูกปล่อยจนกว่า ASP จะเสร็จสิ้นการประมวลผลเพจ ในทำนองเดียวกัน ถ้าคุณปล่อยอ็อบเจ็กต์โดยการสร้างอินสแตนซ์อ็อบเจ็กต์อื่นและกำหนดให้กับตัวแปรอ็อบเจ็กต์ที่ใช้แล้ว ASP จะคงการอ้างอิงไปยังอินสแตนซ์อ็อบเจ็กต์ดั้งเดิม สำหรับสคริปต์ส่วนใหญ่ การสร้างออบเจ็กต์หลายรายการอาจไม่ทำให้เกิดปัญหา แต่หากออบเจ็กต์ใช้ทรัพยากรที่ใช้ร่วมกัน เช่น การเชื่อมต่อฐานข้อมูล ปัญหาก็อาจเกิดขึ้นได้
เนื่องจากออบเจ็กต์มีขอบเขตของหน้า คุณจึงไม่ต้องพึ่งพาการเพิ่มออบเจ็กต์ด้วยตนเอง ตัวอย่างเช่น ลูปต่อไปนี้จะสร้างอ็อบเจ็กต์การเชื่อมต่อ 1001 ซึ่งจะสามารถเปิดการเชื่อมต่อส่วนใหญ่ได้แม้กระทั่งกับเซิร์ฟเวอร์ SQL ขนาดใหญ่:
-
สำหรับฉัน = 0 ถึง 1,000
ตั้งค่า Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "สตริงการเชื่อมต่อ"
ต่อไป
-
โดยทั่วไป คุณควรพยายามหลีกเลี่ยงการสร้างวัตถุภายในลูป หากหลีกเลี่ยงไม่ได้ คุณควรปล่อยทรัพยากรที่ใช้โดยออบเจ็กต์ด้วยตนเอง หากออบเจ็กต์การเชื่อมต่อถูกสร้างขึ้นเพียงครั้งเดียว และการเชื่อมต่อทางกายภาพกับทรัพยากรข้อมูลถูกเปิดและปิดในแต่ละลูป ตัวอย่างข้างต้นจะทำงานได้ตามปกติ:
-
ตั้งค่า Conn = Server.CreateObject("ADODB.Connection")
สำหรับฉัน = 0 ถึง 1,000
Conn.Open "สตริงการเชื่อมต่อ"
คอน.ปิด
ต่อไป
-
การกำหนดขอบเขตเซสชันของวัตถุ ในแอปพลิเคชัน วัตถุขอบเขตเซสชันจะถูกสร้างขึ้นสำหรับแต่ละเซสชันใหม่และจะเผยแพร่หลังจากสิ้นสุดเซสชัน ดังนั้นจึงมีหนึ่งออบเจ็กต์สำหรับแต่ละเซสชันที่ใช้งานอยู่ ขอบเขตเซสชันใช้สำหรับออบเจ็กต์ที่ถูกเรียกจากหลายสคริปต์ แต่จะมีผลกับเซสชันผู้ใช้เพียงเซสชันเดียวเท่านั้น คุณสามารถกำหนดขอบเขตเซสชันออบเจ็กต์ได้เมื่อจำเป็นเท่านั้น หากคุณจำเป็นต้องใช้ขอบเขตเซสชัน คุณต้องเข้าใจโมเดลเธรดของส่วนประกอบที่จัดเตรียมออบเจ็กต์ เนื่องจากจะส่งผลต่อประสิทธิภาพและสภาพแวดล้อมความปลอดภัยของออบเจ็กต์ สำหรับข้อมูลเพิ่มเติม ดู "ข้อมูลขั้นสูง: ปัญหาด้านประสิทธิภาพ" ในหัวข้อนี้
เมื่อต้องการกำหนดขอบเขตเซสชันของวัตถุ ให้เก็บวัตถุไว้ในวัตถุในตัวของเซสชัน ASP คุณสามารถใช้แท็ก <OBJECT> ในไฟล์ Global.asa หรือใช้วิธี Server.CreateObject บนเพจ ASP เพื่อสร้างเซสชัน- วัตถุที่กำหนดขอบเขต เช่นวัตถุโดเมน
ในไฟล์ Global.asa คุณสามารถใช้แท็ก ;OBJECT> ที่ขยายแอตทริบิวต์ RUNAT (ต้องตั้งค่าเป็น Sever) และแอตทริบิวต์ SCOPE (ต้องตั้งค่าเป็นเซสชัน) ตัวอย่างต่อไปนี้สร้างอินสแตนซ์ที่กำหนดขอบเขตเซสชันของออบเจ็กต์ Ad Rotator:
<OBJECT RUNAT=เซิร์ฟเวอร์ขอบเขต=รหัสเซสชัน=MyAd PROGID="MSWC.Adrotator">
</วัตถุ>
เมื่อคุณจัดเก็บออบเจ็กต์ไว้ในออบเจ็กต์เซสชัน คุณจะสามารถเข้าถึงออบเจ็กต์ได้จากหน้าใดก็ได้ในแอปพลิเคชัน คำสั่งต่อไปนี้ใช้อินสแตนซ์วัตถุที่สร้างขึ้นโดยแท็ก <OBJECT> ในตัวอย่างก่อนหน้านี้:
<%= MyAd.GetAdvertisement("addata.txt") %>
บนเพจ ASP คุณยังสามารถใช้เมธอด Server.CreateObject เพื่อจัดเก็บอ็อบเจ็กต์ในอ็อบเจ็กต์ที่มีอยู่แล้วในเซสชันได้ ตัวอย่างต่อไปนี้จัดเก็บอินสแตนซ์ของออบเจ็กต์ Ad Rotator ในออบเจ็กต์เซสชัน
<% ตั้งค่าเซสชัน("MyAd") = Server.CreateObject("MSWC.Adrotator") %>
ในการแสดงโฆษณา คุณควรได้รับอินสแตนซ์ของออบเจ็กต์ Ad Rotator ที่จัดเก็บไว้ในออบเจ็กต์เซสชัน จากนั้นจึงเรียกใช้เมธอดเพื่อแสดงออบเจ็กต์:
<% ตั้งค่า MyAd = เซสชัน ("MyAd") %>
<%= MyAd.GetAdvertisement("addata.txt") %>
ASP จะไม่สร้างอินสแตนซ์ของวัตถุที่ประกาศด้วยแท็ก <OBJECT> จนกว่าจะมีการอ้างอิงโดยคำสั่งสคริปต์ในไฟล์ .asp วิธีการServer.CreateObjectจะสร้างอินสแตนซ์ของวัตถุทันที ดังนั้นจึงเป็นการดีกว่าที่จะใช้แท็ก <OBJECT> มากกว่าคุณสมบัติ Server.CreateObject สำหรับออบเจ็กต์ที่กำหนดขอบเขตเซสชัน
ให้ขอบเขตแอปพลิเคชันวัตถุ
วัตถุขอบเขตแอปพลิเคชันเป็นอินสแตนซ์เดียวของวัตถุที่ถูกสร้างขึ้นเมื่อแอปพลิเคชันเริ่มทำงาน วัตถุนี้ถูกใช้ร่วมกันโดยคำขอของลูกค้าทั้งหมด เฉพาะในบางกรณีเท่านั้นที่คุณจะต้องกำหนดขอบเขตของแอปพลิเคชันออบเจ็กต์ วัตถุอรรถประโยชน์บางอย่าง เช่น เคาน์เตอร์ ฯลฯ อาจต้องมีขอบเขตการใช้งาน แต่โดยทั่วไป คุณสามารถใช้ทางเลือกอื่นที่แนะนำในหัวข้อถัดไปได้ นอกจากนี้ โมเดลเธรดยังส่งผลต่อประสิทธิภาพและสภาพแวดล้อมความปลอดภัยของออบเจ็กต์ (ดู "ข้อมูลขั้นสูง: ปัญหาด้านประสิทธิภาพ" ในหัวข้อนี้)
เมื่อต้องการกำหนดขอบเขตของแอปพลิเคชันออบเจ็กต์และจัดเก็บไว้ในออบเจ็กต์ในตัวของ ASP Application คุณสามารถใช้แท็ก <OBJECT> ในไฟล์ Global.asa หรือสร้างขอบเขตของแอปพลิเคชันโดยใช้เมธอด Server.CreateObject บนอินสแตนซ์ออบเจ็กต์ของหน้า ASP .
ในไฟล์ Global.asa คุณสามารถใช้แท็ก ;OBJECT> ที่ขยายแอตทริบิวต์ RUNAT (ต้องตั้งค่าเป็น Sever) และแอตทริบิวต์ SCOPE (ต้องตั้งค่าเป็นเซสชัน) ในเพจ ASP คุณสามารถใช้ Server.CreateObject เพื่อจัดเก็บอินสแตนซ์ของวัตถุในวัตถุในตัวของแอปพลิเคชัน สำหรับตัวอย่างการใช้แท็ก <OBJECT> และ Server.CreateObject โปรดดูส่วนก่อนหน้า "การกำหนดขอบเขตเซสชันให้กับออบเจ็กต์"
ทางเลือกอื่นสำหรับขอบเขตเซสชันและแอปพลิเคชัน ให้เซสชันวัตถุหรือขอบเขตแอปพลิเคชันเมื่อจำเป็นเท่านั้น เนื่องจากวัตถุเหล่านี้ยังคงอยู่จนกว่าเซสชันหรือแอปพลิเคชันจะสิ้นสุดลง พวกเขาใช้ทรัพยากรเช่นหน่วยความจำหรือการเชื่อมต่อฐานข้อมูลที่อาจมีประโยชน์มากกว่าในรูปแบบอื่น นอกจากนี้ โมเดลเธรดของส่วนประกอบยังส่งผลต่อประสิทธิภาพของออบเจ็กต์ที่คุณสร้างขึ้น โดยเฉพาะอย่างยิ่งที่มีขอบเขตเซสชันหรือแอปพลิเคชัน
ในหลายกรณี วิธีการที่ดีกว่าการสร้างออบเจ็กต์ที่กำหนดขอบเขตแอปพลิเคชันหรือเซสชันคือการใช้ตัวแปรในขอบเขตเซสชันหรือแอปพลิเคชันเพื่อส่งข้อมูลไปยังออบเจ็กต์ที่สร้างขึ้นในระดับเพจ ตัวอย่างเช่น อย่าให้เซสชันออบเจ็กต์การเชื่อมต่อ ADO หรือขอบเขตแอปพลิเคชันเนื่องจากการเชื่อมต่อที่สร้างขึ้นจะยังคงเปิดอยู่เป็นระยะเวลานานในขณะที่สคริปต์ไม่ได้ใช้การเชื่อมต่อ ODBC ร่วมกันอีกต่อไป อย่างไรก็ตาม คุณสามารถจัดเก็บสตริงการเชื่อมต่อ ODBC ในออบเจ็กต์ในตัวของเซสชันหรือแอปพลิเคชัน และรับสตริงจากอินสแตนซ์ออบเจ็กต์การเชื่อมต่อที่สร้างขึ้นบนเว็บเพจได้ วิธีนี้ทำให้คุณสามารถจัดเก็บข้อมูลที่ใช้บ่อยในเซสชันหรือเนมสเปซแอปพลิเคชันได้ แต่จะสร้างออบเจ็กต์ที่มีข้อมูลนั้นเมื่อจำเป็นเท่านั้น
อ็อบเจ็กต์ JScript ที่ผู้ใช้กำหนด คุณสามารถสร้างอ็อบเจ็กต์ JScript ของคุณเองได้โดยการกำหนด Constructor ที่สร้างและเตรียมใช้งานคุณสมบัติและวิธีการของอ็อบเจ็กต์ใหม่ เมื่อสคริปต์เรียกตัวสร้างโดยใช้ตัวดำเนินการใหม่ อินสแตนซ์ของวัตถุจะถูกสร้างขึ้น สคริปต์ ASP รองรับออบเจ็กต์ที่ผู้ใช้กำหนด ซึ่งทำงานอย่างถูกต้องเมื่อมีขอบเขตของหน้า อย่างไรก็ตาม หากออบเจ็กต์ JScript ที่ผู้ใช้กำหนดได้รับขอบเขตแอปพลิเคชันหรือเซสชัน อาจส่งผลต่อการทำงานของออบเจ็กต์ โดยเฉพาะอย่างยิ่ง หากวัตถุมีขอบเขตเซสชันหรือแอปพลิเคชัน สคริปต์จากหน้าอื่นสามารถรับคุณสมบัติของวัตถุได้ แต่ไม่สามารถเรียกวิธีการของมันได้
ข้อมูลขั้นสูง: ปัญหาด้านประสิทธิภาพ แบบจำลองเธรดของส่วนประกอบอาจส่งผลต่อประสิทธิภาพการทำงานของเว็บไซต์ โดยทั่วไปแล้ว แนะนำให้ใช้ออบเจ็กต์ที่มีเครื่องหมาย Both สำหรับใช้ในสคริปต์ ASP ทั้งหมด โดยเฉพาะอย่างยิ่งในออบเจ็กต์เซสชันและแอปพลิเคชัน วัตถุแบบเธรดเดียวเลิกใช้แล้ว
เนื่องจากคุณอาจไม่ได้ควบคุมโมเดลเธรดของออบเจ็กต์ที่คุณใช้เสมอไป คำแนะนำต่อไปนี้สามารถช่วยให้คุณได้รับประสิทธิภาพสูงสุด:
วัตถุขอบเขตหน้า วัตถุที่ทำเครื่องหมายว่าทั้งสองหรืออพาร์ตเมนต์จะให้ประสิทธิภาพที่ดีที่สุดแก่คุณ
วัตถุขอบเขตแอปพลิเคชัน โดยทั่วไป คุณควรหลีกเลี่ยงการวางวัตถุในวัตถุแอปพลิเคชัน หากคุณจำเป็นต้องใช้ออบเจ็กต์ขอบเขตแอปพลิเคชัน คุณจะได้รับประสิทธิภาพที่ดีที่สุดจากออบเจ็กต์ที่ติดแท็กทั้งสองรวมกับ FreeThreadedMarshaler คุณสามารถใช้แท็ก <OBJECT> หรือใช้เมธอด Server.CreateObject เพื่อจัดเก็บออบเจ็กต์ด้วยแท็ก Single, Free หรือ Both ในออบเจ็กต์ Application คุณต้องใช้แท็ก <OBJECT> กับวัตถุแบบเธรดอพาร์ตเมนต์
ออบเจ็กต์ขอบเขตเซสชัน ออบเจ็กต์ที่มีเครื่องหมาย Both จะให้ประสิทธิภาพที่ดีที่สุดแก่คุณ การใช้ออบเจ็กต์เธรดเดี่ยวหรือเธรดอพาร์ตเมนต์จะทำให้เว็บเซิร์ฟเวอร์ล็อกเซสชันบนเธรดเดียว อ็อบเจ็กต์แบบฟรีเธรดไม่ล็อกเซสชัน แต่ไม่ทำงานเร็วเท่าที่ควร ในวัตถุเซสชัน คุณสามารถใช้แท็ก <OBJECT> หรือเมธอด Server.CreateObject เพื่อจัดเก็บวัตถุได้
หากคุณได้ติดตั้งเอกสารประกอบ SDK คุณจะได้รับข้อมูลโดยละเอียดเกี่ยวกับโมเดลเธรดและประสิทธิภาพของส่วนประกอบที่เกี่ยวข้อง (เอกสารประกอบ SDK ไม่พร้อมใช้งานบน Windows 95 และใหม่กว่า)