Bir nechta ulanishlar mavjud bo'lganda, ulanishlar bilan bog'liq muammolarni qanday hal qilish mumkin emas (JB yoki tashqi tizimlar).

Bir nechta ulanishlarni boshqarish bo'yicha savolim bor. Ushbu ulanishlar JB ulanishi, SOA ulanishi, EMS ulanishi va boshqalar bo'lishi mumkin.

Aytaylik, menda 1 ta ma'lumotlar bazasi ulanishi bor, u erda ma'lumotlarni tortaman va menda turli ma'lumotlarga ega va mustaqil bo'lgan 2 ta EMS ulanishlari bor. Ma'lumotlar EMSga yuboriladi va ma'lumotlar muvaffaqiyatli yuborilganmi yoki yo'qmi holatini yangilaydi.

1) Agar ma'lumotlar bazasi ulanishi o'chirilgan bo'lsa yoki biz ma'lumotlar bazasiga kira olmasak, boshqa muammolar bo'lsa 2) Har qanday 1 EMS ulanishi o'chirilgan bo'lsa, ilova boshqa EMS ulanishini qayta ishlashni davom ettirishi kerak. 3) Agar biz EMSga ma'lumotlarni yuborish imkoniga ega bo'lsak, lekin ma'lumotlar bazasi bilan bog'liq muammolarning ma'lumotlar bazasi holatini yangilay olmasak nima bo'ladi, biz xotiradagi barcha xabarlar bilan nima qilishimiz kerak va biz EMSga yuborishimiz kerak. 4) 1 EMS ga ulanishni o'rnatib bo'lmadi, ammo boshqasi o'rnatishga muvaffaq bo'ldi va shuning uchun dastur ushbu EMS xabarlarini qayta ishlashi kerak.

Bu men hal qilishim kerak bo'lgan ba'zi sinov holatlari. Iltimos, hal qilishim kerak bo'lgan boshqa muammolar bo'lsa, menga xabar bering


person Naveen Chakravarthy    schedule 12.04.2011    source manba


Javoblar (1)


Turli manbalarga bir nechta ulanish, System.Transactions uchun yaxshi yechim kabi ko'rinadi (agar EMS buni qo'llab-quvvatlasa).

Shunga o'xshash narsani sinab ko'ring, shu tarzda barcha 3 operatsiya ish birligi sifatida muvaffaqiyatli yoki muvaffaqiyatsiz bo'ladi.

        try
        {
            using (TransactionScope tran = new TransactionScope())
            {
                Method1Save(); //DB
                Method2Save(); //EMS1
                Method3Save(); //EMS2
                tran.Complete();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Problem " + ex.ToString());
        }

Agar EMS TransactionScope-ni qo'llab-quvvatlamasa, siz uni manuel tarzda bajarishingiz kerak bo'ladi, ehtimol tranzaktsiyani ulanishning o'ziga qo'yib, so'ngra operatsiyalar muvaffaqiyatli bo'lgach, barcha tranzaktsiyalarni amalga oshiring, bu esa har bir ma'lumot manbai uchun ulanishlarni uzoqroq saqlashni anglatadi.

person Jon Raynor    schedule 12.04.2011
comment
Men allaqachon TransactionScope dan foydalanmoqdaman. Sizga bir misol keltiraman. Biz ma'lumotlar bazasidan ma'lumotlarni o'qiymiz. Aytaylik, bizda 500 ta yozuv bor, biz ma'lumotlarni qayta ishlash va EMSga jo'natish uchun 5 ta ipni ishga tushiramiz. Agar EMS xabarni qabul qila olmasa, navbat to'lgan yoki ba'zi ulanish muammolari bo'lsa, nima qilishimiz kerak, dasturni qayta ishga tushiramizmi yoki kutamizmi yoki biroz vaqt va qayta urinib ko'ring. Qancha marta qayta urinib ko'rsangiz va boshqa mavzular haqida nima deyish mumkin, agar biz uning muvaffaqiyatsizligini allaqachon bilsak, boshqa mavzularga xabar yuborishga ruxsat beramizmi yoki barcha mavzularni biroz kutib turing va qayta urinib ko'ring. - person Naveen Chakravarthy; 12.04.2011
comment
boshqa holat. Agar biz ma'lumotlar bazasi holatini yangilashni istasak, bu xabar muvaffaqiyatli yoki muvaffaqiyatsiz yuboriladi. Agar biz xabarni EMSga yuborsak, lekin muammoning ma'lumotlar bazasini yangilay olmasak nima bo'ladi. Boshqa xabarlarni EMSga yuborishga ruxsat beramizmi yoki JB ulanishi hal bo'lguncha kutamizmi, agar holat yangilanmagan bo'lsa, u biz yuborgan xabarni yana yuborishga harakat qiladi. - person Naveen Chakravarthy; 12.04.2011
comment
@Bunny - Mavzu muvaffaqiyatsiz tugashi uchun boshqa barcha iplarni bekor qilishdan oldin ishlamay qolganlar soniga chegara qo'yish mumkin. Agar ozgina chayqalish bo'lsa, siz to'xtashni xohlamaysiz (shunchaki nosozlikni qaytadan navbatga qo'yishingiz mumkin), lekin ma'lumotlar bazasi ishlamay qolsa, uni bezovta qilishning hojati yo'q. Bundan tashqari, siz ma'lumotlar bazasi xatosini diqqat bilan ko'rib chiqishingiz va ulanish xatolarini ulanish xatolariga nisbatan ajratishni ko'rishingiz mumkin. - person Jon Raynor; 12.04.2011
comment
@Bunny - Agar siz xabarni BMS ga yuborgan bo'lsangiz va JB ishlamay qolgan bo'lsa, ma'lumotlar bazasi zaxiralanmaguncha xabarni vaqtinchalik do'konda saqlashingiz kerak. Ehtimol, bu xotirada yoki fayl tizimida XML yoki boshqa format sifatida saqlanib qolgan. Keyin ma'lumotlar bazasi zaxiralangandan so'ng, har qanday yangi xabarlarni qayta ishlashdan oldin yuborilgan xabarlarni vaqtinchalik do'konda qayta ishlaysiz. Asosan, xabarni JBga saqlanmaguncha vaqtincha ushlab turish uchun ushbu ishni hal qilish uchun sizga ikkilamchi saqlash tizimi kerak bo'ladi. - person Jon Raynor; 12.04.2011
comment
2 ta EMS navbatiga xabar yuborishim kerak. Aytaylik, birinchi navbat ishlamayaptimi va ikkinchi navbat ishlayaptimi? Agar iplar soni 3 bo'lsa. 3 ta ipning hammasi pastga tushgan birinchi navbatda xabar yuboradi. Men ikkilamchi xotiradan foydalanmoqdaman, lekin bu faqat muvaffaqiyatsiz xabarlar uchun va muvaffaqiyatsiz xabarlar tartibni saqlash uchun bitta tishli bo'lgan boshqa ish zarrachasida qayta urinib ko'riladi. Shunday qilib, har qanday EMS amalga oshirilganda, boshqa barcha EMS xabarlari qayta ishlanadi. Barcha xabarlar tugagach, biz muvaffaqiyatsiz xabarlardan tashqari yangi xabarlarni olamiz, chunki u birinchi navbatda muvaffaqiyatsiz xabarlarni qayta ishlashi kerak. - person Naveen Chakravarthy; 12.04.2011