JavaRush /Kurslar /All lectures for UZ purposes /Resurslarni tranzaktsiyalar bilan sinxronlash

Resurslarni tranzaktsiyalar bilan sinxronlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

Turli tranzaktsiyalar dispetcherlarini qanday yaratish va ular sinxronlashtirilishi kerak bo‘lgan mos resurslar (DataSourceTransactionManager JDBC-dan DataSource bilan, HibernateTransactionManager Hibernate-dan SessionFactory bilan va hokazo) bilan qanday bog‘liq ekanligini endi tushungan bo‘lishingiz kerak. Bu bo‘limda ilova kodingiz (to‘g‘ridan-to‘g‘ri yoki bilvosita, masalan JDBC, Hibernate yoki JPA kabi saqlashning API-interfeysi orqali) ushbu resurslarni to‘g‘ri yaratish, qayta ishlatish va tozalashni qanday ta'minlashi haqida ma'lumot berilgan. Shuningdek, tranzaktsiyalarni sinxronlashni qanday (ixtiyoriy) mos TransactionManager orqali ishga tushirish mumkinligi haqida ham ma'lumot berilgan.

Yuqori darajadagi sinxronizatsiya bilan yondashuv

Yuqori darajadagi yondashuv - bu Spring asosidagi shablonlardan foydalangan holda saqlash API-interfeyslarının integratsiya qilish yoki o'ziga xos ORM API-interfeyslarini tranzaktsiyaga yo‘naltirilgan bean-fabrikalar yoki proksilar bilan boshqarishdir. Bu tranzaktsiyaga yo‘naltirilgan yechimlar resurslarni yaratish va qayta ishlatishni, tozalashni, resurslarni tranzaktsiyalar bilan ixtiyoriy sinxronlashni va xatolarni o‘zgartirishni ichki darajada avtomatik ravishda boshqaradi. Shunday qilib, foydalanuvchi ma'lumotlarga kirish kodiga bu vazifalarni hal qilish kerak emas, aksincha, ma'lumotlarni saqlashning nostandart logikasiga qaratilishi mumkin. Ko‘pincha Java API-interfeysidan foydalanasiz yoki JdbcTemplate yordamida JDBC standarti orqali kirishni ta'minlaydigan shablon asosidagi yondashuvni qo‘llaysiz. Bu dasturiy yechimlar ushbu qo'llanmaning keyingi bo‘limlarida batafsil bayon etilgan.

Past darajadagi sinxronizatsiya bilan yondashuv

DataSourceUtils (JDBC uchun), EntityManagerFactoryUtils (JPA uchun), SessionFactoryUtils (Hibernate uchun) va shunga o'xshash boshqa sinflar pastroq darajada mavjud. Agar ilova kodingiz to‘g‘ridan-to‘g‘ri saqlashning mahalliy API-interfeysi turidagi resurslar bilan ishlashi kerak bo‘lsa, ushbu sinflardan Spring Framework tomonidan boshqariladigan mos keladigan nusxalarni olish, tranzaktsiyalarni (ixtiyoriy) sinxronlash va jarayon davomida yuzaga keladigan istisnolarni mos keladigan API-interfeysidagi istisnolarni to‘g‘ri ko‘rsatish uchun foydalaning.

Misol uchun, JDBC bilan, DataSource uchun getConnection() metodini chaqirishning an'anaviy yondashuvi o‘rniga, quyida ko‘rsatilganidek, Spring'dan org.springframework.jdbc.datasource.DataSourceUtils sinfini ishlatishingiz mumkin:

Connection conn = DataSourceUtils.getConnection(dataSource);

Agar mavjud tranzaktsiya allaqachon u bilan sinxronlashtirilgan (ularishgan) ulanishga ega bo‘lsa, ushbu nusxa qaytariladi. Aks holda, metod chaqiruvi yangi ulanish yaratilishiga olib keladi, u har qanday mavjud tranzaktsiya bilan (ixtiyoriy) sinxronlashtiriladi va xuddi shu tranzaktsiyada keyingi qayta ishlatish uchun mavjud bo‘ladi. Oldin aytib o‘tilganidek, har qanday SQLException Spring Framework'dagi CannotGetJdbcConnectionException istisnosiga o‘raladi, bu Spring Framework'dagi DataAccessException tekshirilmagan istisnolar iyerarxiyasidagi istisnolardan biridir. Bunday yondashuv SQLException'dan osonlikcha olingan ko‘proq ma'lumotni beradi va ma'lumotlar bazalari o‘rtasida va hatto saqlashning turli texnologiyalari o‘rtasida ko‘chma qilishni ta'minlaydi.

Ushbu yondashuv Spring'dan tranzaktsiyalarni boshqarishni foydalanmasdan ham ishlaydi (tranzaktsiyalarni sinxronlash ixtiyoriy), shuning uchun siz uni Spring'dan tranzaktsiyalarni boshqarishni ishlatishingiz yoki ishlatmasligingizdan qat'i nazar, foydalana olasiz.

Albatta, JDBC, JPA yoki Hibernate uchun Spring'ning qo‘llab-quvvatlash vositalaridan foydalanganingizda, odatda DataSourceUtils yoki boshqa yordamchi sinflardan foydalanmasangiz yaxshi bo‘ladi, chunki siz Spring'ning abstraksiyasi orqali ishlashdan, to‘g‘ridan-to‘g‘ri mos keladigan API-interfeyslar bilan ishlashdan ko‘ra ko'proq mamnun bo‘lasiz. Masalan, agar siz Spring JdbcTemplate yoki JDBC'ni osonroq ishlatish uchun jdbc.object paketidan foydalanayotgan bo‘lsangiz, ulanishni to‘g‘ri qidirish "parda ortida" sodir bo‘ladi va sizga maxsus kod yozish kerak emas.

TransactionAwareDataSourceProxy

Eng past darajada TransactionAwareDataSourceProxy sinfi mavjud. Bu maqsadli DataSource uchun proksi bo‘lib, Spring boshqaradigan tranzaktsiyalarga moslikni oshirish uchun maqsadli DataSource ni o‘rab oladi. Bu jihatdan u Java EE serveri tomonidan taqdim etilgan JNDI'dan tranzaktsiyaviy DataSource'ga o‘xshaydi.

Sizga deyarli hech qachon ushbu sinfdan foydalanish kerak bo‘lmaydi yoki xohlamaysiz, faqat mavjud kodni chaqirish va unga JDBC'dan DataSource interfeysi uchun standart implementatsiyani berishga ehtiyojingiz yo‘q bo‘lsa. Bunday holatda, ushbu koddan foydalanish mumkin, lekin u Spring boshqaradigan tranzaktsiyalarda ishtirok etadi. Yangi o‘z kodingizni yaratishingiz mumkin, oldin aytib o‘tilgan yuqori darajadagi abstraksiyalarni ishlatishingiz mumkin.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION