ใช่มันปลอดภัยที่จะผ่านการเชื่อมต่อ คุณจัดการการเชื่อมต่อในบล็อกควบคุมภายนอก ไม่มีอะไรที่ไม่ปลอดภัยเกี่ยวกับเรื่องนี้
สิ่งที่ไม่ปลอดภัยคือการเขียนรหัสที่ไม่รับประกันว่าการเชื่อมต่อจะถูกกำจัดอย่างเหมาะสมในเวลาที่เหมาะสม การลืมทำความสะอาดทรัพยากรนั้นไม่มีความเกี่ยวข้องกับการผ่านไปมา คุณสามารถเขียนโค้ดที่ทำให้การเชื่อมต่อแบบแฮงค์โดยไม่ผ่านมันไปไหน
ใน C ++ คุณได้รับการคุ้มครองโดย RAII ถ้าคุณจัดสรรในกองซ้อนหรือใช้ตัวชี้สมาร์ท ใน C # สร้างกฎอย่างหนักที่วัตถุที่ใช้แล้วทิ้งทั้งหมด (เช่นการเชื่อมต่อ) จะถูกประกาศในบล็อก "using" ใน Java ทำความสะอาดด้วยตรรกะลองในที่สุด มีการตรวจสอบโค้ดในโค้ดเลเยอร์ข้อมูลทั้งหมดเพื่อให้มั่นใจในสิ่งนี้
กรณีการใช้งานที่พบบ่อยที่สุดคือเมื่อคุณมีการดำเนินการหลายอย่างที่สามารถรวมกันได้ในหลายวิธี และแต่ละวิธีเรียงสับเปลี่ยนเหล่านี้จำเป็นต้องมีธุรกรรมระดับอะตอม (ทำทั้งหมดสำเร็จหรือย้อนกลับ) จากนั้นคุณจะต้องผ่านการทำธุรกรรม (และการเชื่อมต่อที่เกี่ยวข้อง) ไปยังวิธีการทั้งหมด
สมมติว่าเรามีการกระทำ foobar () จำนวนมากที่สามารถรวมกันได้หลายวิธีเช่นเดียวกับธุรกรรมอะตอมมิก
//example in C#
//outer controlling block handles clean up via scoping with "using" blocks.
using (IDbConnection conn = getConn())
{
conn.Open();
using (IDbTransaction tran = conn.BeginTransaction())
{
try
{//inner foobar actions just do their thing. They don't need to clean up.
foobar1(tran);
foobar2(tran);
foobar3(tran);
tran.Commit();
}
catch (Exception ex)
{ tran.Rollback(); }
}
}//connection is returned to the pool automatically
BTW คุณจะต้องเปิดการเชื่อมต่อให้ช้าที่สุดเท่าที่จะทำได้ให้กำจัดพวกเขาโดยเร็วที่สุด เพื่อนร่วมทีมของคุณอาจถูกต้องหากคุณปฏิบัติต่อการเชื่อมต่อในฐานะสมาชิกวัตถุแนะนำให้พวกเขาเป็นสถานะที่ไม่จำเป็นและปล่อยให้การเชื่อมต่อเปิดนานกว่าที่จำเป็น แต่การกระทำผ่านการเชื่อมต่อหรือธุรกรรมเป็นพารามิเตอร์นั้นไม่ผิดโดยกำเนิด
BTW ทั้งนี้ขึ้นอยู่กับการสนับสนุนภาษาของคุณสำหรับฟังก์ชั่นชั้นหนึ่งคุณอาจใช้เวลาในรายการของการกระทำ foobar () ดังนั้นฟังก์ชั่นหนึ่งสามารถจัดการกับพีชคณิตการกระทำทั้งหมดได้ กำจัดการทำซ้ำของบล็อกควบคุมภายนอกสำหรับการเปลี่ยนแปลงแต่ละครั้ง