PDA

View Full Version : جدا شدن کاربر از بانک اطلاعاتی اسکیو ال



BATIS
جمعه 04 دی 1394, 19:21 عصر
سلام به همه دوستان ، به تازگی با مشکلی در يکی از نرم افزارهای بانک اظلاعاتی مواجه شدم که واقعا" برایم مایه تعجب است ، به روش های مختلف متوصل شدم که مسئله را حل کنم ولی پس از گذشت حدود ده روز هنوز نتيجه ای نگرفتم و همه تلاشهام با شکست مواجه شده ، لذا لطفا اگر تجربه مشابهی دارید و یا اينکه ميتونید راهنمایی خاصی بکنید خیلی ممنون میشم .
مشکل از اين قراره که : پس از وارد شدن کاربر به سيستم از طريق يک کلاينت در شبکه محلی واتصال به پايگاه داده اصلی مستقر بر روی سرور بانک اطلاعاتی همه چيز بطور نرمال کار ميکنه تا اينکه اگر کاربر مربوطه مدتی (حدود بیست ثانيه يا بیشتر) از نرم افزار استفاده نکنه برنامه از بانک اطلاعاتی جدا شده و به محض مراجعه مجدد کاربر با پيغام : Login failed for user ….. روبرو ميشويم و باید دوباره نرم افزار را از نو راه اجرا کند تا بتواند با آن کار کند . ضمنا کد برنامه با Borland Delphi 7 نوشته شده و برای اتصال به اسکيو ال از ADO Connection استفاده شده است .
نکته آنکه اين اتفاق طبق جدول زیر در سيستمهایی که با ويندوز 7 کار ميکنند بیشتر رخ ميدهد وضمنا کاربران از طريق SQL Authentication به سرور وصل ميشوند و هيچگونه Orphan User هم نداريم .
تست نرم افزار در شرایط گوناگون :
http://barnamenevis.org/images/attach/jpg.gif

حمیدرضاصادقیان
شنبه 05 دی 1394, 13:03 عصر
سلام..
پارامترهایی که در Connection String تنظیم میکنید چقدر هست؟ آیا براش Session Expired در نظر گرفتید؟
وضعیت Idle Connection ها رو در SQL Server چطور مدیریت می کنید؟

BATIS
شنبه 05 دی 1394, 16:22 عصر
داخل connection string هیچ time out ای تعریف نکردم ولی روی خود کامپوننت ado یکی بود که اونو هم روی ۳۰ دقیقه هم تنظیم کردم ولی فایده ای نداشت . لطف میکنید در مورد idle connection و نحوه مدیریتش برام بیشتر توضیح بدید . ممنون میشم . اگه راه دیگه ای هم به ذهنت تون میرسه بگید لطفا .

حمیدرضاصادقیان
شنبه 05 دی 1394, 22:02 عصر
ببینید اون timeout در داخل connection String در واقع برای این هست که اگه یک دستوری تا 1 دقیقه جوابی به سمت کلاینت نداد یعنی دستور به سمت سرور ارسال شده و در اون بازه جوابی برگشت داده نشده خود ADO خطای Timeout Expired رو به سمت کلاینت صادر میکنه در صورتی که دستور در حال اجرا می باشد. مثلا ممکنه کوئری شما سنگین بوده و بد نوشته شده و بیش از 1 دقیقه زمان برای اجرا میگیرد. در این لحظه این خطا صادر می شود.
idle Conenction ها در واقع کانکشن هایی هستند که کاری انجام نمیدهند. مثلا اگر در داخل Connecton String شما Connection Pooling رو فعال کرده باشید ممکنه چندین کانکشن باز سمت سرور باشه و شما فکر کنید کاری نمی کنند ولی در واقع اینطوری نیست و مشغول به انجام Query ها هستند.همچنین میتونید توی Event ONConncetionClose مربوط به Ado Connection نیز یک پیغامی بنویسید که اگر Conenction بسته میشه بتونید ردش رو بگیرید. یا اینکه خطاهای داخل برنامه رو مانیتور کنید شاید خطایی داره رخ میده.

BATIS
یک شنبه 06 دی 1394, 09:36 صبح
ممنون از راهنمای هاتون . راستش مسئله کمی بغرنج تره ، در ابتدا تمامی برنامه ها و تمامی کاربران هیچ مشکلی نداشتند . حتی هنوز هم برخی از کاربرها که ویندوز و اسکیوال سرور و نسخه نرم افزارشون تغییر نکرده بدون مشکل دارند کار میکنند . ولی به محض اینکه برنامه بعضی از سیستمها عوض شد و همچنین اسکیو ال سرورشون رو ارتقاء دادیم مشکلات ظاهر شد . به همین دلیل هم نمیدونیم مسئله از نرم افزاره یا اسکیو ال .
البته هر دو رو trace هم کردیم ولی به نتیجه ای نرسیدیم داخل event های adoconnection هم انگار همه چیز به خوبی انجام میشه وحتی زمان disconnect شدن پیام خطایی نداریم !!
حال همونطور که گفتم فقط سیستمهایی که با ویندوز 7 دارند به سرور کانکت میشن بعد از ورود به برنامه تا مدتی مشکل ندارند و کار میکنند ولی اگر مثلا چند ثانیه (حدودا 30 ثانیه) سیستم را مینی مایز کنند و کاری نکنند پس از مراجعه میبینند که نرم افزار از بانک اطلاعاتی جدا شده و دوباره باید از نو راه اندازی و اجرا بشه !!!
واقعا گیج شدیم . پاسخی ندارید ؟