JavaRush /Kurslar /All lectures for UZ purposes /Springda DataSource ni Inicializatsiya qilish

Springda DataSource ni Inicializatsiya qilish

All lectures for UZ purposes
Daraja, Dars
Mavjud

org.springframework.jdbc.datasource.init paketi DataSourceni boshlash uchun yordam beradi. Ichki ma'lumotlar bazasini qo'llab-quvvatlash vositalari ilova uchun DataSource ni yaratish va boshlash uchun bir variant beradi. Lekin ba'zida bironta serverda ishlashni boshlagan namuna talab qilinishi mumkin.

Spring XML orqali ma'lumotlar bazasini boshlash

Agar ma'lumotlar bazasini boshlash kerak bo'lsa va DataSourcega murojaat qilish mumkin bo'lsa, spring-jdbc namespace'dagi initialize-database tegini ishlatish mumkin:

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="classpath:com/foo/sql/db-schema.sql"/>
    <jdbc:script location="classpath:com/foo/sql/db-test-data.sql"/>
</jdbc:initialize-database>

Oldingi misol ma'lumotlar bazasi uchun ikkita belgilangan skriptni bajaradi. Birinchi skript sxemani yaratadi, ikkinchisi jadvalni qandaydir ma'lumotlar bilan to'ldiradi. Skriptlar joylashuvi Spring dagi resurslar uchun Ant uslubidagi boshqarish belgilaridan foydalanib, classpath*:/com/foo/**/sql/*-data.sql kabi shablon bo'lishi mumkin. Agar siz shablon ishlatsangiz, skriptlar ularning URL yoki fayl nomi bo'yicha leksik tartibda ishlaydi.

Ma'lumotlar bazasini boshlashning odatiy mantiqi belgilanadigan skriptlarni shartsiz bajarishdir. Bu har doim kerak emas – masalan, skriptlar allaqachon mavjud bo'lgan ma'lumotlar bazasida ishlasa. Ma'lumotlar yo'qolishining ehtimoli oshadi, agar an'anaviy sxemaga amal qilinsa (ilgari ko'rsatib o'tilgan): avval jadvallar yaratiladi va keyin ma'lumotlar joylashtiriladi. Agar jadvallar allaqachon mavjud bo'lsa, birinchi qadam xatolik bilan tugaydi.

Ammo mavjud ma'lumotlarni yaratish va o'chirish ustidan ko'proq nazorat qilish uchun XML namespace ba'zi qo'shimcha imkoniyatlarni beradi. Birinchi imkoniyat - bu boshlashni yoqish va o'chirish uchun bayroq. Muhitga qarab uni o'rnating (masalan, tizim xususiyatlaridan yoki muhit binden qiymatni oling). Keyingi misolda qiymat tizim xususiyatidan olinadi:

<jdbc:initialize-database data-source="dataSource"
    enabled="#{systemProperties.INITIALIZE_DATABASE}"> 
    <jdbc:script location="..."/>
</jdbc:initialize-database>
  1. enabled uchun qiymatni INITIALIZE_DATABASE tizim xususiyatidan olamiz.

Ikkinchi variant mavjud ma'lumotlar bilan nima bo'lishi mumkinligini nazorat qilishdir. Buning uchun, ig'ilohli SQL xatolarini skriptlardan e'tiborsiz qoldirish imkoniyatini boshqarish mumkin, quyidagi misolda ko'rsatilganidek:

<jdbc:initialize-database data-source="dataSource" ignore-failures="DROPS">
    <jdbc:script location="..."/>
</jdbc:initialize-database>

Oldingi misolda, ba'zan ma'lumotlar bazasi bo'sh bo'lishi kutilishi va skriptlar DROP buyruqlarini ishlatishi mumkin, bu esa bajarilmaydi. Shu sababli, noto'g'ri DROP SQL buyruqlari e'tiborsiz qoldiriladi, lekin boshqa xatolar istisno yaratadi. Bu SQL dialekti DROP … IF EXISTS (yoki shunga o'xshash) ni qo'llab-quvvatlamasa, lekin barcha ma'lumotlarni yana qayta yaratishdan oldin shartsiz o'chirish kerak bo'lganda foydali. Bu holatda birinchi skript odatda DROP buyruqlaridan iborat bo'ladi, keyin CREATE buyruqlari keladi.

ignore-failures parametrini NONE (standart), DROPS (noto'g'ri DROP buyruqlarini e'tiborsiz qoldirish) yoki ALL (barcha xatolarni e'tiborsiz qoldirish) qilib sozlash mumkin.

Har bir buyruq ; belgi bilan yoki skriptda ; belgi yo'q boʻlsa, yangi satr bilan ajratilishi kerak. Buni global yoki har bir skript uchun boshqarish mumkin, quyidagi misolda ko'rsatilganidek:

<jdbc:initialize-database data-source="dataSource" separator="@@"> 
    <jdbc:script location="classpath:com/myapp/sql/db-schema.sql" separator=";"/> 
    <jdbc:script location="classpath:com/myapp/sql/db-test-data-1.sql"/>
    <jdbc:script location="classpath:com/myapp/sql/db-test-data-2.sql"/>
</jdbc:initialize-database>
  1. Skriptlar uchun ajratuvchilarni @@ qilib o'rnatamiz.
  2. db-schema.sql uchun ajratuvchini ; qilib o'rnatamiz.

Bu misolda ikkita test-data skriptlari @@ ni buyruqlar ajratuvchisi sifatida ishlatadi va faqat db-schema.sql ; ishlatadi. Bu konfiguratsiya standart ajratuvchi @@ ekanligini va db-schema skripti uchun bu qiymatni o'zgartirishni belgilaydi.

Agar XML namespace'dan foydalanishdan ko'proq nazorat kerak bo'lsa, DataSourceInitializer ni to'g'ridan-to'g'ri ishlatish mumkin va uni ilovangizda komponent sifatida aniqlash mumkin.

Ma'lumotlar bazasiga bog'liq boshqa komponentlarni boshlash

Katta qirollik ilovalari (ma'lumotlar bazasidan foydalanmaydiganlar Spring kontekstini boshlashdan oldin) hech qanday qo'shimcha to'sqinliksiz ma'lumotlar bazasini boshlashni ishlatishi mumkin. Agar ilovangiz bunday bo'lmasa, ushbu bo'limning qolgan qismini oʻqishga toʻgʻri kelishi mumkin.

Ma'lumotlar bazasini boshlovchi DataSource nusxasiga bog'liq va boshlash qaytarish qo'ng'iroqlarida berilgan skriptlarni bajaradi (XML'dagi init-method bilan yoki @PostConstruct bilan belgilangan metoddagi komponentda yoki InitializingBean komponentida afterPropertiesSet() metod bilan). Agar boshqa binlar ham xuddi shu ma'lumotlar manbaiga bog'liq bo'lsa va ma'lumotlar manbaini boshlash qaytarish qo'ng'iroqlarida ishlatsa, muammo bo'lishi mumkin, chunki ma'lumotlar hali boshlanmagan. Ko'p uchraydigan misol – bu ilova boshlanishida ma'lumotlarni ma'lumotlar bazasidan yuklaydigan kechiktiruvchi kechiktirmasdan boshlanadigan kesh.

Ushbu muammoni chetlab o'tish uchun ikki yo'li bor: keshni boshlash strategiyasini kechroqqa o'zgartirish yoki ma'lumotlar bazasini boshlovchi birinchi boshlanishiga ishonch hosil qilish.

Agar kesh boshlash strategiyasini kechroq o'zgartirish bo'lsa, ilova sizning nazoratingiz ostida bo'lsa, oson bo'lishi mumkin. Buni amalga oshirish bo'yicha ba'zi takliflar:

  • Keshni birinchi foydalanishda kechroqqa boshlashni amalga oshiring, bu ilovaga boshlanish vaqtini yaxshilaydi.

  • Kesh yoki keshni boshlaydigan alohida komponent Lifecycle yoki SmartLifecycle ni amalga oshirsin. Ilova konteksti ishga tushirilganda, SmartLifecycle ni avtomatik ravishda boshlatish mumkin, autoStartup bayrog'ini yoqishingiz mumkin va Lifecycle ni qo'lda, keng qamrovli kontekst uchun ConfigurableApplicationContext.start() ni chaqirish orqali ishga tushirish mumkin.

  • Keshni boshlashni ishga tushirish uchun Spring'dan ApplicationEvent ni yoki shunga o'xshash maxsus kuzatuvchi mexanizmini foydalaning. ContextRefreshedEvent kontekst tomonidan har doim chop etiladi, u foydalanishga tayyor bo'lganida (barcha binlar boshlangandan keyin), shuning uchun bu juda foydali usul bo'lishi mumkin (bu SmartLifecycle ning standart ishlash usuli hisoblanadi).

Ma'lumotlar bazasini boshlovchi birinchi boshlanishiga ishonch hosil qilish ham qiyin emas. Buni amalga oshirish bo'yicha ba'zi fikrlar:

  • Spring'dan BeanFactory ning standart ishlash mantig'iga tayaning, ya'ni binlar ro'yxatga olish tartibida boshlanadi. Bu ilovaning modullarini tartibga soladigan va ma'lumotlar bazasi va ma'lumotlar bazasini boshlash birinchi ro'yxatga olishni ta'minlaydigan elementlar to'plamidan <import/> XML konfiguratsiyasini ishlatib, osongina tashkil etilishi mumkin.

  • DataSource va undan foydalanadigan ish komponentlarini ajratib, ularning boshlanish tartibini alohida ApplicationContext namunalari ichida tartibga solishni boshqaring (masalan, asosiy kontekst DataSource ni o'z ichiga oladi, va boshqa kontekst ish komponentlarini o'z ichiga oladi). Bunday tuzilma Spring'ning veb-ilovalarida keng tarqalgan bo'lsa-da, uni kengroq manbalarga qo'llash mumkin.

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