فرآیند اتصال به دیتابیس از طریق mongoose


یکی از وظایف مهم در بک اند، ارتباط با دیتابیس (connection) هست. من برحسب تجربیات گذشته چند تا ویژگی رو در نحوه پیاده سازی ارتباط با دیتابیس در نظر میگیرم:

  • فرآیند بک اند در همه ریکوئست ها نیاز به برقراری ارتباط با دیتابیس نداره.
  • ممکنه لازم بشه در یک فرآیند بک اند(thread) که از ایجاد کانکشن های متعدد به یک دیتابیس جهت مدیریت resource ها جلوگیری کنم (اگر لازم بشه)
  • ارتباط به دیتابیس در انتهای فرآیندها بک اند بسته بشه.

برای همین هر جا که نیاز به دیتابیس داشته باشم، کانکشن رو صدا میزنم. و هنگام کانکشن دنبال راهی هستم که بررسی کنم ببینم اگر قبلا اتصال به دیتابیس برقرار شده، دیگه بهش وصل نشم.

در ادامه، میخوام مدلی رو که در express js و به کمک کتابخونه mongoose پیاده سازی کردم، شرح بدم:

در mongoose ما یک property داریم به اسم mongoose.connections که یک آرایه از کانکشن های دیتابیس رو نگه میداره. یک property دیگه هم داره به اسم mongoose.connection که در واقع اولین کانکشن رو بر میگردونه و با mongoose.connections[0] یکی هست. بررسی اتصال به دیتابیس رو با یکی از property های mongoose.connection به اسم readyState میشه بررسی کرد. اگر false بود، یعنی هنوز کانکشنی با دیتابیس برقرار نشده و میتونیم اقدام به ارتباط با دیتابیس کنیم.

ماژول زیر در واقع ماژول قطع و وصل ارتباط با mongodb از طریق mongoose هست:

تابع connect رو هر موقع که نیاز به دیتابیس داشته باشم، میتونم صدا بزنم و نگران استفاده بیش از حد از resource های سیستم نباشم.

اما سوال دیگه اینه که کی disconnect رو صدا بزنم؟ به شخصه بعد از اینکه پاسخ به ریکوئست تموم شد و ارسال شد، اقدام به قطع ارتباط با دیتابیس میکنم و هنوز مشکلی با این موضوع پیدا نکردم.


البته داخل تابع Disconnect هم میشه به کمک mongoose.connection.readyState بررسی کرد که اگر ارتباطی وجود داره، قطع بشه.

دیگه اینکه یک مُدل قطع ارتباط دیگه هم در mongoose هست :

mongoose.connection.close()

ولی mongoose.disconnect روش درست تری برای قطع ارتباط با دیتابیس هست و همه شرایط رو تحت پوشش قرار میده.

:)