PDA

View Full Version : كانكشن به ديتا بيسsqlرو اول برنامه ايجاد كنم و آخر برنامه ببندم يا براي هر ترنزكشن باز وبسته كنم



gama118
یک شنبه 08 اسفند 1389, 16:43 عصر
سلام

من يه برنامه واسه سيستمهاي توليد دارم مينويسم ولي به يه چيزي شك دارم

آيا من بايد اول برنامه موقع لاكين كاربر يه كانكشن اتصال به sqlserver باز كنم و در هنگام انجام هر ترنزكشن از اين كانكشن باز استفاده كنم و در پايان برنامه كانكشن رو ببندم
يا براي انجام هر ترنزكشن همون موعه يه كانكشن بار كنم و آخرش ببندمش

اگه از روش دوم استفاده كنم با توجه به اينكه در اين جور سيستمها تعداد دفعات مراجعه به ديتا بيس زياده مشكل كندي ايجاد نميشه ؟
يا در روش اول مشكلي روي sql server ايجاد نميشه ؟
كدوم روش اصوليه ؟

mehdi.mousavi
یک شنبه 08 اسفند 1389, 18:04 عصر
سلام.
بازای هر Connection String واحد، یک Connection Pool برای ارتباط با بانک ایجاد میشه. Connection Pool جایی هستش که Connection های شما
اونجا برای مدت مشخصی Cache میشن تا سیستم در صورت نیاز بتونه ارتباط لازم برای درخواستهای بعدی رو با مراجعه به این Pool برقرار کنه.

ADO.NET با پشتیبانی از Connection Pooling هزینه ایجاد Socket، برقراری ارتباط، Parse کردن Connection String و ... رو به حداقل میرسونه.
Connection Pooling جایی خوب جواب میده که شما بازای کاری که میخواهید انجام بدید Connection رو ایجاد کرده و هر وقت کارتون با اون Connection
به اتمام رسید، اون ارتباط رو قطع کرده و Resource های مورد نظر رو به سیستم برگردونید.

این ایده آل ترین حالتی هستش که میشه از Connection Pooling بهره برد.

موفق باشید.

gama118
دوشنبه 09 اسفند 1389, 09:48 صبح
پس منظورتون اينه كه من هر بار كه ترنزكشني رو اجرا مي كنم كانكشن رو ببندم و بعد دوباره در ترنزكشن بعدي دوباره بازش كنم !!؟
يهني با توجه به اينكه كانكشن كش ميشه در دفعات بعدي باز كردن ترنزكشن هزينه اي نداره ؟

mehdi.mousavi
دوشنبه 09 اسفند 1389, 09:57 صبح
پس منظورتون اينه كه من هر بار كه ترنزكشني رو اجرا مي كنم كانكشن رو ببندم و بعد دوباره در ترنزكشن بعدي دوباره بازش كنم !!؟ يهني با توجه به اينكه كانكشن كش ميشه در دفعات بعدي باز كردن ترنزكشن هزينه اي نداره ؟

سلام.
من اسمی از Transaction نبردم. عرض کردم Connection... این دو خیلی با هم فرق میکنن. به این کد دقت کنید:


using (SqlConnection connection = new SqlConnection(ConnectionString))
{
using (SqlCommand command = new SqlCommand(sqlCommand, connection))
{
connection.Open();
//whatever....
}
}

اینجا، من Connection رو برقرار میکنم، Command مورد نظرم رو اجرا می کنم (فارغ از اینکه به چه Transaction ای تعلق داره)، و در نهایت اونو Dispose می کنم.
دفعه بعد که همین کد اجرا بشه، ADO.NET هنگام باز کردن Connection بررسی می کنه ببینه میتونه از Connection Pool ارتباط مورد نظر رو بگیره یا نه... اگر بتونه،
این کارو میکنه. اگر هم نه دوباره باید Connection String رو Parse کنه، ارتباط روی Physical Channel رو برقرار کنه و ...

موفق باشید.

مرتضی تقدمی
سه شنبه 10 اسفند 1389, 15:21 عصر
من هم يه چيزي از قول يكي از دوستان بگم. نمي دونم چقدر حرفش درسته، اما من فكر مي كنم حرفش درست باشه ؛

وقتي با بانك اطلاعاتي كاري نداري و از اون استفاده نمي كني، كانكشن رو ببند. اين موضوع هنگامي كه برنامه تو شبكه كار مي كنه، براي كاهش سربار سرور و خطوط ارتباطي خيلي تاثير داره.

موفق باشيد

gama118
چهارشنبه 11 اسفند 1389, 08:14 صبح
سلام
درسته ولي بحث سر اينه كه تو برنامه هاي بزرگ ، با فواصل زماني كم نياز داريم تا با ديتا بيس ارتباط برقرار كنيم و اين باز وبسته كردن مداوم كانكشن سربارش بيشتر از باز بودن يكسره كانكشن نيست ؟