الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Three Tier Model Concepts

مغلق
بدأه bashmohandes في 11 نوفمبر 2005 · 17 رد · 8,795 مشاهدة · في هندسة البرمجيات
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

-09

أغلبنا سمع عن الThree Tier Model و الذي يتكون من الأجزاء الثلاثة الشهيرة

1- ال Data Tier

2- ال Business Logic Tier

3- ال Presentation Tier

10_11_05_04_07_04_1131667624pic1.jpg

و هذا هو النظام الأشهر في بناء التطبيقات التجارية و سنحاول شرحه ببساطة و اعطاء أمثلة ان شاء الله

1- ال Data Tier

و هي الجزء الذي يتولى التعامل مع مصدر المعلومات مهما كان نوعه (قاعدة بيانات, ملفات نصية , .... الخ) و هي التي تتولى تخزين و استرجاع البيانات بغض النظر عن النظام نفسه و ماذا يفعل

و ينقسم هذا الجزء الى قسمين أصغر

أ- Data Access Layer و هي الجزء المسؤول عن التعامل المباشر مع قاعدة البيانات فهي تأخذ الQuery أو الStored Procedure و تنفذها و تعود بالناتج بدون تفكير و يمكن ببساطة نقل هذا الجزء من نظام لآخر دون تغيير في الكود الخاص بها ... و مثال بسيط عليها هو ال ADO.net نفسه

ب- Proxy Layer

و هي Classes تنفذ الوظائف الأساسية على الTables مثل الUpdate و الSelect و الDelete و الInsert و لكل Table له Class Proxy خاصة به تتولى العمليات الخاصة به

بمعنى أنه اذا فرضنا أننا نملك Database تحوي Tables بهذه الأسماء Users, Articles ...

و هكذا سيكون لدينــا 2 Classes من نوع Proxy و كل منهم يحوي الCode اللازم لاضافة و حذف و تعديل و قراءة المعلومات من الجدول المناظر له في الDatabase

و لكن يظهر سؤال ماهي الطريقة التي سنمثل بها الData خارج الDatabase أي عندما نقوم بعمل شئ مشابه لهذا

Proxy_Users user = new Proxy_Users();
user.GetUser(2)

فكيف سنخزن الUser Data و أين ؟؟؟

يجب أن يكون هناك مخزن للمعلومات و هنــا يمكن استخدام الStrongly Typed DataSets مثلاً أو أن تقوم بعمل Class تمثل كل Table من اختيارك بدون الاعتماد على ال STDataSets

و سنأتي لهذا الموضوع لاحقاً

2- الBusiness Tier

و هي المنطقة التي يتحول فيها النظام من كونه Tables مخزنة في Database الى Object Oriented Model أي أننا بعد كتابة هذا الجزء يمكننا أن ننسى تماماً طبيعة تخزين البيانات..

كمثال على الDatabase السابقة سيكون لدينا Class User و Class Article و داخل ال Article يوجد reference على Object من نوع User تمثل كاتب المقال و أيضاً داخل الUser يوجد Collection من الArticle Objects تمثل المقالات التي تخص هذا المستخدم و هكذا يمكننا استخدام الClasses بهذه الطريقة

User user = new User();
user.FirstName = "Mohammed";
user.LastName = "Ahmed";
user.Age = 12;
user.Save();
Article article = new Article();
article.Subject = "anyThing";
article.CreationDate = DateTime.Now;
article.Author = user;
article.Save();
user.Articles.Add(article);

و هكذا تجد أن الكود أصبح أكثر قوة و أسهل في التعامل و أصبح ايضاًً Encapsulated بشكل متميز و استطعنا اخفاء تفاصيل التعامل مع الDatabase في الtiers الأدنى و أيضاً داخل ال BusinessObjects استطعنا اخفاء استخدامنا للDataTier حتى يمكننا في الLayer الأعلى أن ننسى فعليا طبيعة البيانات

3- الPresentation Tier

و هي الجزء الذي يتعامل مع مستخدم البرنامج (من الاخر الUser interface ) بجميع أنواعه و البيئات المستخدمة سواء كان Windows Application أو Web Application أو حتى Console Applications و يتم في هذا الجزء التعامل المباشر مع الBusinessTier و لا يُسمح أبدا بالتعامل المباشر مع الDataTier و في الحقيقة لو كان تصميمك جيداً فلن تحتاج أبدأ الDataTier في الPresentation Tier

و للحديث بقية

تم تعديل هذه المشاركة بواسطة bashmohandes في 12 نوفمبر 2005 في 21:29

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#2

تحديث الموضوع

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#3

رائع جدا

على فكرة معظم الشركات بطبق الموضوع ده بس محدش فاهم الكلام ده معناه ايه :D

الموضوع ده متشعب جدا خصوصا لو دخل فيه COM و WebServices

شكرا على الموضوع :)

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#4

موضوع رائع،،، وربما يكون متأخرا بالنسبة لي!! لكن في ذلك الوقت لم يتوفر لي الاستزادة في العلم،، الموضوع من أحلى وألذ الأشياء في البرمجة والتطوير، بدل نقش الدجاج الذي كنا نفتريه في الحاسب... أعتقد كان أول تطبيق لي يستخدم هذا المفهوم هو برنامج الشطرنج بشكل عام في الثانوي! طبعا لم أكن ملما بهذه المسميات،، لكن الحاجة وسنين البرمجة القديمة والمشي على الحصى واللدغ من الشفرات العقيمة وغدر قلة الشروحات أو Documentation والوقوع في الحفر والمزالق واستعمال أسوأ وأبطأ الأساليب البرمجية والخوارزمية علمتني الخطأ فأتجنبه. كأني أقول في نفسي حفظت 100 طريقة غير ناجحة!

أرجو أن تكمل الدروس، وأتمنى أن تضع دروسك ودروس أصحابك في قسم للدروس لسهولة الوصول إليها،، وأعتقد الموضوع يليق بقسم هندسة التطبيقات، فهذا لا يتعلق بلغة برمجة معينة.

بالتوفيق!

#5

أولا أنا أقترح أن يوضع من ضمن موضوعات هندسة البرامج....

لأن هذا الموضوع جدا متميز...

يشكر صاحبه شكر جزيل..

وأنا هنا أعطي مثالين لمشروع اشتغلت عليه من فترة...

وهومشروع مدرسة...يدعى سكوليو SchoolU

24_11_05_05_19_29_1132838369ex1.JPG

24_11_05_05_20_15_1132838415ex_.JPG

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#6

و كمثال على تصميم لData Tier

افترض وجود Database بهذا التصميم

بمعنى أنه اذا فرضنا أننا نملك Database تحوي Tables بهذه الأسماء User, Article and Category

12_11_05_10_19_04_1131819544db.JPG

يمكننا أن نقول أن كل Proxy Class تتكون من Base Class و Child Class

الBase Class تحدد الشكل الأساسي للClass و الChild يحدد الImplementation الخاص بهذه الClass على نوع محدد من الData Sources بمعنى أنه اذا اردنا أن نجعل الApplication يعمل على ال SqlServer سنقوم بعمل Inheritance من ال Proxy Base و عمل SqlProxy Child مخصص للSql Server

و هذا يسهل التحول من من Data Source الى اخر مجرد اعادة عمل الInheritance من الPorxyBase لعمل مثلاً OracleProxy و تحديد الImplementation الخاص بالOracle

12_11_05_09_33_52_1131816832Proxy.jpg

هذا مثال على Proxy Base Class

using System.Collections;
using DataAccessLayer;
using Info_Tier;

namespace Data_Tier
{
	public abstract class Proxy_Article
	{
  protected DAL m_conn; 
  protected string m_strConn; 

  public Proxy_Article()
  {
 	 m_strConn = Connection.GetConnectionString();
 	 m_conn = new DAL(DbProvider.SqlServer, m_strConn);
  }

  public abstract int ArticleAdd(Info_Article info_Article);
  public abstract void ArticleModifyBySID(int SID, Info_Article info_Article);
  public abstract ArrayList ArticleGetAll();
  public abstract void ArticleDelete(int SID);
  public abstract Info_Article ArticleGet(int SID);
  public abstract ArrayList ArticleGetByPerson_SID(int Person_SID);
	}

}

و يكون هذا شكل الSqlProxy

using System;
using System.Collections;
using System.Data;
using System.Data.SqlClient;
using Info_Tier;

namespace Data_Tier
{
	public class SqlProxy_Article : Proxy_Article
	{
  public SqlProxy_Article()
  {
  }

  public override int ArticleAdd(Info_Article info_Article)
  {
 	 SqlParameter[] parameters = new SqlParameter[5];
 	 parameters[0] = new SqlParameter("@SID", info_Article.SID);
 	 parameters[0].Direction = ParameterDirection.Output;
 	 parameters[1] = new SqlParameter("@Subject", info_Article.Subject);
 	 parameters[1].Direction = ParameterDirection.Input;
 	 parameters[2] = new SqlParameter("@Details", info_Article.Details);
 	 parameters[2].Direction = ParameterDirection.Input;
 	 parameters[3] = new SqlParameter("@MadeOn", info_Article.MadeOn);
 	 parameters[3].Direction = ParameterDirection.Input;
 	 parameters[4] = new SqlParameter("@Person_SID", info_Article.Person_SID);
 	 parameters[4].Direction = ParameterDirection.Input;
 	 m_conn.ExecuteStoredProcedureNonQuery("spArticleAdd", parameters);
 	 return (int) parameters[0].Value;

  }

  public override void ArticleModifyBySID(int SID, Info_Article info_Article)
  {
 	 SqlParameter[] parameters = new SqlParameter[5];
 	 parameters[0] = new SqlParameter("@SID", info_Article.SID);
 	 parameters[1] = new SqlParameter("@Subject", info_Article.Subject);
 	 parameters[2] = new SqlParameter("@Details", info_Article.Details);
 	 parameters[3] = new SqlParameter("@MadeOn", info_Article.MadeOn);
 	 parameters[4] = new SqlParameter("@Person_SID", info_Article.Person_SID);
 	 m_conn.ExecuteStoredProcedureNonQuery("spArticleUpdateBySID", parameters);

  }

  public override ArrayList ArticleGetAll()
  {
 	 ArrayList info_array = new ArrayList();
 	 IDataReader reader = m_conn.ExecuteStoredProcedureReader("spArticleGetAll", null);
 	 while (reader.Read())
 	 {
    Info_Article info = new Info_Article();
    info.SID = (int) reader["SID"];
    info.Subject = reader["Subject"].ToString();
    info.Details = reader["Details"].ToString();
    info.MadeOn = DateTime.Parse(reader["MadeOn"].ToString());
    info.Person_SID = (int) reader["Person_SID"];
    info_array.Add(info);

 	 }
 	 return info_array;

  }

  public override void ArticleDelete(int SID)
  {
 	 m_conn.ExecuteStoredProcedureNonQuery("spArticleDeleteBySID", new SqlParameter[] {new SqlParameter("@SID", SID)});

  }

  public override Info_Article ArticleGet(int SID)
  {
 	 Info_Article info = new Info_Article();
 	 IDataReader reader = m_conn.ExecuteStoredProcedureReader("spArticleGetBySID", new SqlParameter[] {new SqlParameter("@SID", SID)});
 	 if (reader.Read())
 	 {
    info.SID = (int) reader["SID"];
    info.Subject = reader["Subject"].ToString();
    info.Details = reader["Details"].ToString();
    info.MadeOn = DateTime.Parse(reader["MadeOn"].ToString());
    info.Person_SID = (int) reader["Person_SID"];
 	 }
 	 return info;

  }

  public override ArrayList ArticleGetByPerson_SID(int Person_SID)
  {
 	 ArrayList info_array = new ArrayList();
 	 IDataReader reader = m_conn.ExecuteStoredProcedureReader("spArticleGetByPerson_SID", new SqlParameter[]{new SqlParameter("@Person_SID", Person_SID)});
 	 while (reader.Read())
 	 {
    Info_Article info = new Info_Article();
    info.SID = (int) reader["SID"];
    info.Subject = reader["Subject"].ToString();
    info.Details = reader["Details"].ToString();
    info.MadeOn = DateTime.Parse(reader["MadeOn"].ToString());
    info.Person_SID = (int) reader["Person_SID"];
    info_array.Add(info);

 	 }
 	 return info_array;
  }

	}

}

و ستلاحظ في الCodes استخدام Objects من نوع Info_Article و هي النقطة التي تكلمنا عنها في شرح الDataTier في الدرس السابق عندما ذكرنا استخدام الStrongly Typed DataSets في تخزين البيانات في الذاكرة أو عمل Class من اختيارك لتمثيل شكل الTable و هذه الطريقة الأخيرة هي المستخدمة فقد قمت بعمل Class تُسمى Info_Article تمثل الSchema الخاصة بالArticle Table و كل Object منها يمثل صف واحد من المعلوماتد

و هذا هو شكل الInfo_Article Class

using System;

namespace Info_Tier
{
	public class Info_Article
	{
  private int m_SID;
  private string m_Subject;
  private string m_Details;
  private DateTime m_MadeOn;
  private int m_Person_SID;

  public int SID
  {
 	 set { this.m_SID = value; }
 	 get { return this.m_SID; }
  }

  public string Subject
  {
 	 set { this.m_Subject = value; }
 	 get { return this.m_Subject; }
  }

  public string Details
  {
 	 set { this.m_Details = value; }
 	 get { return this.m_Details; }
  }

  public DateTime MadeOn
  {
 	 set { this.m_MadeOn = value; }
 	 get { return this.m_MadeOn; }
  }

  public int Person_SID
  {
 	 set { this.m_Person_SID = value; }
 	 get { return this.m_Person_SID; }
  }

	}
}

و هكذا يكون لكلل Table لدينا في الDatabase هذه الClasses

1- ال Base Proxy Class مثال الProxy_Article

2- ال Child Specific Class مثال الSqlProxy_Article

3- الInfo Class مثال ال Info_Article

و كما ذكرنا الInfo_Article هي مجرد مخزن بيانات و الobject منه يماثل Row أو صف واحد من البيانات في الDatabase من هذا النوع و هكذا يمكننا تمثيل الQuery Result في هيئة Array of Info Objects و لهذا ستجد أن الدالة GetAll في ال Proxy_Article الناتج منها ArrayList و هو في الحقيقة Array of Info_Article

ثم نعود و نسأل عندما أحب أن أنشئ object من الProxy فماذا أفعل ؟؟؟

في هذه الحالة التي يكون لديك base abstract class و مجموعة من الchild classes و سيتم استخدام الbase class كpointer على أي من الchild objects فان الحل دائما و أبدأً يكون استخدام الDesign Pattern الشهير Factory

و هو أن تصنع Class أخرى مهمتها انشاء الProxy Classes من النوع المطلوب و ارجاع pointer من نوع الparent class

و يكون الكود في هذه الحالة للFactory Class

public class Factory
{
public static Proxy_Article GetArticleProxy()
{
if ( certain condition)
return new SqlProxy_Article();
return new OracleProxy_Article();
}
}

حيث الCertain Condition هو الشرط الذي يحدد نوع الDatabase التي أتخاطب معها فربما كان هذا الشرط قيمة في الRegistry أو ملف Config أو اي شئ اخر

و هكذا عندما أحتاج لاستخدام الProxy فان الكود يكون بسيط

Proxy_Article proxyArticle = Factory.GetArticleProxy();

و أخيراً قبل أن ننهي شرح الDataAccess Layer

ماذا عن الConnection String من سيكون المسؤول عنه

ببساطة سنقوم بعمل Class اسمها Connection تحوي function واحدة فقط static و هي GetConnectionString و تكون هذه الfunction مسؤولة عن احضار الConnection String سواء كان مخزن HardCoded أو في ملف خارجي أو مُشفر في ملف أو في الRegistry و يكون الكود على هذا الشكل مثلاً

public class Connection
{
public static string GetConnectionString()
{
if(certain condition)
return "Data Source=(local); Database = Northwind; Integrated Security = SSPI;
return "Oracle Connection String ";
}
}

و هكذا يمكننا تغيير الDatabase الخاصة بالبرنامج في ثواني بدون اللجوء الى اعادة كتابة الCode كله كل ما سيتم في هذه الحالة

كتابة الProxy الخاص بالDatabase الجديدة و تغيير الConnection String و ستكون الDataTier جاهزة للتعامل مع الDatabase الجديدة و لن نحتاج لتغيير سطر واحد في الطبقات الأعلى و بفرض أن هذه الطبقة على شكل dll سيتم استبدال الdll الخاصة بالتعامل مع الSql Server بالdll الخاصة بالOracle و ما يمكن ببعض التفاصيل البسيطة الاستغناء عن هذا

و للحديث بقية في الBusiness Tier

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#7

ممكن يا شباب تحاولوا تقرأوا عن Microsoft Data blocks الموضوع ده أكثر من رائع و بيدعم فكرة الـnTier بشكل قوي لو تم أستعماله بطريقة صحيحة

http://www.daveranck.com/Patterns/BlockLinks/default.aspx أساسيه :) تحتوى على مكتبات تساعد كثير فى تطوير البرامج بأستخدام الـnTier ( مصدر مفتوح :) )

http://msdn.microsoft.com/library/default....da/html/uip.asp

http://www.dotnetjunkies.com/Tutorial/29EF...87F100A9F9.dcik مهمه جدا

Nothing to mention except that I am Muslim

Using your brain is not bad as you think

My Blog

logo.jpg

#8

Up يا شباب

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#9

للرفع و المتابعة

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

#10

السلام عليكم ورحمة الله وبركاتة

ياريت يا bashmohandes تكمل business layer and presenntation layer لان الموضوع مهم جدا وشيق الصراحة

وجزالك الله كل خير

#11

الBusiness Tier

و هذا الجزء هو المسؤول عن تمثيل الEntities الأساسية في النظام على هيئة Classes مثل User , Article , Role, Company ... الخ و يمكن أن تخلف عن شكل الDatabase الأساسي فليس بالضرورة أن يكون لكل Table في قاعدة البيانات Class مناظرة له في الBusinessTier

أيضاً هذا الجزء يتغير من شركة لأخرى .. أي أن كل شركة برمجيات تحدد ملامح أساسية لهذا الجزء ... فقليلأً ما تجد شركتين مختلفتين يستخدمون نفس الBusiness Tier Design ... و أحياناً يعتبر هذا من أسرار الشركة...

سنحاول اليوم شرح أحد الأنماط المستخدمة في انشاء الBusiness Tier و هو مايُسمى Finite State Business Object

و يقصد من معناه أن الBusiness Object يمر في دورة حياته بعدة مراحل أو حالات States و يتم التحول من مرحلة لأخرى عن طريق عملية معينة و يمكننا سرد هذه الحالات الأساسية

1- الكائن الجديد Fresh Object

2- الكائن المحفوظ Saved Object

3- الكائن المُعدل Modified Object

4- الكائن المحذوف Deleted Object

5- الكائن المُتجاهل Ignored Object أو الكائن الميت الحي Zombie Object :lol:

و في هذا الشكل يوجد شرح للحالات و طريقة التحول بينها

24_11_05_12_47_40_1132822060States.gif

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#12

للـأخوة

هناك ما يسمى بال ORM وهو صيغة من صيغ ال Muiti Tire

للفائدة العامة مراجعة الموقع التالي

http://www.mygenerationsoftware.com/portal/default.aspx

مجموعة الدوت نت في السعودية , اشترك معنا لتحصل على كل مفيد في عالم الدوت نت

dotnetinsaudi-subscribe@yahoogroups.com

#13

السلام عليكم ورحمة الله وبركاته ...

بصراحة أول مرة أشوف هذا الموضوع والحقيقة موضوع شيق جداً ولو أنه طرح من فترة طويلة نوعاً ما, لكن أحب أن أسأل سؤالاً يحيرني وهو

ما يلي:

عند استخدام طبقة للتعامل مع الـ DataBase سيكون هناك مكان لعملية الاتصال بقاعدة البيانات قبل تنفيذ أي أمر على الـ DataBase

مثلاً..

قبل إضافة مقالة سيتم فتح اتصل ومن ثم تتم عملية إضافة المقالة, والسؤال هنا

هل نقوم بعملية إغلاق الاتصال بعد عملية إضافة المقالة وبالتالي سنحتاج لفتح اتصال آخر عند إجراء عملية أخرى على البيانات DataBase

... مع العلم أن فتح الاتصال الثاني سيكون أسرع بكثير من فتح الاتصال الأول وذلك لوجود ما يسمى بالـ Connection pool ...

أم نبقي الاتصال مفتوح حتى يتم تحميل كامل الموقع للمستخدم وهنا يأتي السؤال الأهم كيف نبقي الاتصال بقاعدة البيانات مفتوحاً مع

المحافظة على استقلالية الطبقات الثلاثة التي يتحدث عنها المقال, وإن كان الاتصال سيبقى مفتوحاً أين سيتم تخزين المتحول الذي

يحتفظ بالاتصال بقاعدة البيانات, هل نخزنه في Session أم أنه سيكون متحول عام على مستوى الجلسة الواحدة أم ماذا ؟؟؟

من خلال خبرتكم العملية ماهي الطريقة الأفضل لما سبق السؤال عنه مع العلم أني أقوم بتنفيذ مايلي:

أفتح الاتصال قبل أي عملية تنفيذ على الـ DataBase ومن ثم تنفيذ الأوامر وبعدها يتم إغلاق الاتصال وذلك بناء على كثير من المقالات التي

قرأتها وبعض المالتي شاريع الموجودة في موقع Microsoft حول هذا الأمر ...

وماهو دور الـ Interface في تنفيذ هذه بنية الـ Three Tier Model

#14

الأخ اسماعيل ,برنامج مفتوح المصدر يساعد على عملية تحويل برنامجك إلى Muti-tire

oneforall2012 كتب:
للـأخوة

هناك ما يسمى بال ORM وهو صيغة من صيغ ال Muiti Tire

للفائدة العامة مراجعة الموقع التالي

http://www.mygenerationsoftware.com/portal/default.aspx

مجموعة الدوت نت في السعودية , اشترك معنا لتحصل على كل مفيد في عالم الدوت نت

dotnetinsaudi-subscribe@yahoogroups.com

#15

من الأفضل دائماً غلق الConnection بعد كل عملية فهذا يقلل عدد الConnections المتزامنة و هو ما يؤدي الى زيادة في ال DBMS Performance كما أن بعض الحالات في الShared Web Hosting يتم محاسبتك على أساس عدد الConnections المتزامنة و خاصة في الOracle Database Hosting و لهذا يحبذ أن يُغلق الConnection بعد كل عملية كاملة سواء كانت العملية ناجحة أو فاشلة لأي سبب

تم تعديل هذه المشاركة بواسطة bashmohandes في 18 مايو 2006 في 00:54

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#16

همم،، ربما يكون غلق الاتصال مفيدا،، لكن ليس على مستوى البرامج التي يستخدمها عدة متصلين في وقت واحد. ففتح الاتصال وغلقه يأخذ وقتا ليس بالقليل،، كما أن ذلك يأخذ الكثير من موارد الأجهزة. وقد ذكرت أنك تعرف عن ConnectionPool،، في الغالب لو استخدمت قواعد البيانات الحديثة لوفرت لك ذلك دون أن تعلم. لكن للمعلومية،، قد تريد صنع ConnectionPool خاص بك، وفي هذه تبدأ بصنع 10 اتصالات مثلا، وتجعلها جاهزة عند الطلب،، وكل خيط Thread جديد يطلب اتصالا تعطيه اتصالا على أن يرجع الاتصال إلى المسبح ConnectionPool حتى يستخدمه خيط آخر،، لاحظ أنك لا تغلق الاتصال عند انتهائك منه لكنك فقط ترجعه إلى المسبح..

لاحظ أيضا،، أن قواعد البيانات الحديثة توفر لك ConnectionPool دون أن تعلم في الغالب! فإذا ذكرت في شفرتك:

connection.close();

فأنت حقيقة لا تغلق الاتصال، بل فقط ترجع الاتصال إلى المسبح الذي لم تعرف أنه موجود فعلا!،

وإذا ناديت على:

conection.open();

فأنت حقيقة لا تفتح اتصالا جديدا،، بل إنك فقط تأخذ اتصالا جاهزا مفتوحا من قبل من المسبح الذي وفره لك مصمم قاعدة البيانات، ومن الأمثلة Oracle وأعتقد أن SQL Server و MySQL ربما يوفرون نفس الخدمة والله أعلم.

راجع تفاصيل المنتج الذي تستعمله.

وستجد أمثلة كثيرة عن كيفية صناعة ConnectionPool خاص بك،، لكن ربما تريد الاطلاع على حزمة ObjectDatabase، التي في توقيعي،، بالرغم أن هدفها ليس توفير ConnectionPool إلا أنها تحوي تنفيذا لهذه العملية.

بالتوفيق!

#17

حقيقة.. ابو مازن كلامه مزبوط...

ان فتح الاتصال مع قاعدة البيانات يكلف الكثير

ويعتبر غال بعض الشيء لانه في النهاية يشغل (من مشغول) محرك القاعدة...

وبالتالي يضعف آداء الخادم.....

لذا دائما ينصح ان نستخدم مخزن الاتصالات أو ConnectionPool

ولن تجد الا القليل يغلقون الاتصال ويفتحونه لكل متصل...

لماذا تكون الليغو اللعبة الأكثر عبقرية في العالم؟

لأنها غير قابلة للتجزئة ، وتختلف فيما بينها بالألوان و الأشكال ، وتمتلك القدرة على تكوين علاقات مع بعض. نستطيع أن نقول أن أجزاء الليغو أبدية. وهي تشبه الذرات في تراكيبها للكون

-----

وائل بن أحمد كابلي

مستشار تطوير برمجيات | مايكروسوفت للخدمات الاستشارية

MCSE | MCTS SharePoint Infrastructure | MCTS SharePoint - Development | MCP | MSF Essentials

http://blogs.msdn.com/wael

@waelkabli

#18
اقتباس
من الأفضل دائماً غلق الConnection بعد كل عملية فهذا يقلل عدد الConnections المتزامنة و هو ما يؤدي الى زيادة في ال DBMS Performance كما أن بعض الحالات في الShared Web Hosting يتم محاسبتك على أساس عدد الConnections المتزامنة و خاصة في الOracle Database Hosting و لهذا يحبذ أن يُغلق الConnection بعد كل عملية كاملة سواء كانت العملية ناجحة أو فاشلة لأي سبب

اتفق مع كلام حسام و وائل بخصوص ال Connection Pool

:D و لكن لانى اعرف محمد حسام جيداً فلا شك انه يعلم بال Connection Pooling إذا دعنى اتوجه إليك بالسؤال الاتى

ما الفائدة من غلق الاتصال بعد كل عملية ؟

اتمنى من الشباب مراجعة الموضوع التالى على البلوج الخاص بى و خصوصاً تعليق فادى انور

Global Connection For Web Application

Technical Lead Developer

My LinkedIn Profile

اللهم قنى شر الجهل و الجهلاء

( اقْتَرَبَ لِلنَّاسِ حِسَابُهُمْ وَهُمْ فِي غَفْلَةٍ مَّعْرِضُونَ ) {الأنبياء:1}

هذا الموضوع مغلق.

مواضيع مشابهة