JavaRush /Kurslar /All lectures for UZ purposes /Ichki ma'lumotlar bazasini qo'llab-quvvatlash

Ichki ma'lumotlar bazasini qo'llab-quvvatlash

All lectures for UZ purposes
Daraja, Dars
Mavjud

org.springframework.jdbc.datasource.embedded paketi Java'da ichki ma'lumot saqlash tizimlarini qo'llab-quvvatlaydi. HSQL, H2 va Derby ni o'z ichiga olgan yordam mavjud. Yangi turdagi ichki ma'lumotlar bazasini ulash uchun kengaytirilgan API interfeysini ham ishlatilishi mumkin DataSource realizatsiyalari bilan.

Nega ichki ma'lumotlar bazasini ishlatish kerak?

Ichki ma'lumotlar bazasi loyiha ishlab chiqish jarayonida uning soddaligi tufayli foydali bo'lishi mumkin. Uning afzalliklari orasida sozlashning soddaligi, tez ishga tushish, sinov qilish imkoniyati va ishlab chiqish jarayonida SQL tezda rivojlana olish imkoniyati mavjud.

Spring XML orqali ichki ma'lumotlar bazasini yaratish

Agar sizga ichki ma'lumotlar bazasi nusxasini Spring'da ApplicationContext da bean sifatida ifodalash kerak bo'lsa, spring-jdbc namespaceidagi embedded-database tegi foydalanilishi mumkin:

<jdbc:embedded-database id="dataSource" generate-name="true">
    <jdbc:script location="classpath:schema.sql"/>
    <jdbc:script location="classpath:test-data.sql"/>
</jdbc:embedded-database>

Yuqoridagi konfiguratsiya classpath da joylashgan manbalardan schema.sql va test-data.sql dan SQL qo'shilgan HSQL ichki ma'lumotlar bazasini yaratadi. Bundan tashqari, ichki ma'lumotlar bazasiga nodir nom beriladi. Ichki ma'lumotlar bazasi Spring konteynerida javax.sql.DataSource turi sifatida bean bo'lib kirish mumkin, va kerak bo'lganda ma'lumotlarga kirish ob'ektlariga kirgizilishi mumkin.

Dasturiy yo'l bilan ichki ma'lumotlar bazasini yaratish

EmbeddedDatabaseBuilder klassi ichki ma'lumotlar bazasini dasturiy yo'l bilan yaratish uchun ochiq API interfeysini taqdim etadi. Bu misol quyidagi kabi mustaqil muhitda yoki mustaqil integratsiya testida ichki ma'lumotlar bazasini yaratish kerak bo'lganda ishlatilishi mumkin:

Java
EmbeddedDatabase db = new EmbeddedDatabaseBuilder()
        .generateUniqueName(true)
        .setType(H2)
        .setScriptEncoding("UTF-8")
        .ignoreFailedDrops(true)
        .addScript("schema.sql")
        .addScripts("user_data.sql", "country_data.sql")
        .build();
// bazada ishlash (EmbeddedDatabase javax.sql.DataSource ni kengaytiradi)
db.shutdown()
Kotlin
val db = EmbeddedDatabaseBuilder()
        .generateUniqueName(true)
        .setType(H2)
        .setScriptEncoding("UTF-8")
        .ignoreFailedDrops(true)
        .addScript("schema.sql")
        .addScripts("user_data.sql", "country_data.sql")
        .build()
// bazada ishlash (EmbeddedDatabase javax.sql.DataSource ni kengaytiradi)
db.shutdown()

Yanada batafsil ma'lumot olish uchun EmbeddedDatabaseBuilder haqida javadoc ga qarang.

Shuningdek, EmbeddedDatabaseBuilder yordamida Java konfiguratsiyasi bilan ichki ma'lumotlar bazasini yaratish mumkin, bu quyidagi misolda ko'rsatilgan:

Java
@Configuration
public class DataSourceConfig {
    @Bean
    public DataSource dataSource() {
        return new EmbeddedDatabaseBuilder()
                .generateUniqueName(true)
                .setType(H2)
                .setScriptEncoding("UTF-8")
                .ignoreFailedDrops(true)
                .addScript("schema.sql")
                .addScripts("user_data.sql", "country_data.sql")
                .build();
    }
}
Kotlin
@Configuration
class DataSourceConfig {
    @Bean
    fun dataSource(): DataSource {
        return EmbeddedDatabaseBuilder()
                .generateUniqueName(true)
                .setType(H2)
                .setScriptEncoding("UTF-8")
                .ignoreFailedDrops(true)
                .addScript("schema.sql")
                .addScripts("user_data.sql", "country_data.sql")
                .build()
    }
}

Ichki ma'lumotlar bazasi turini tanlash

Bu bo'limda Spring tomonidan qo'llab-quvvatlanadigan uchta ichki ma'lumotlar bazasidan birini tanlash haqida gap boradi. Bo'lim quyidagi mavzularni o'z ichiga oladi:

  • HSQL ni ishlatish

  • H2 ni ishlatish

  • Derby ni ishlatish

HSQL ni ishlatish

Spring HSQL 1.8.0 va undan yuqorisini qo'llab-quvvatlaydi. Agar tur aniq belgilamasa, HSQL ichki ma'lumotlar bazasi standart bo'ladi. HSQL ni aniq belgilash uchun, embedded-database tegi type atributini HSQL ga sozlang. Agar siz API interfeysidan foydalanayotgan bo'lsangiz, setType(EmbeddedDatabaseType) metodini EmbeddedDatabaseType.HSQL parametri bilan chaqiring.

H2 ni ishlatish

Spring H2 ma'lumotlar bazasini qo'llab-quvvatlaydi. H2 ni faollashtirish uchun, embedded-database tegi type atributini H2 ga sozlang. Agar siz API interfeysidan foydalanayotgan bo'lsangiz, setType(EmbeddedDatabaseType) metodini EmbeddedDatabaseType.H2 parametri bilan chaqiring.

Derby ni ishlatish

Spring Apache Derby 10.5 va undan yuqorisini qo'llab-quvvatlaydi. Derby ni faollashtirish uchun, embedded-database tegi type atributini DERBY ga sozlang. Agar siz API interfeysidan foydalanayotgan bo'lsangiz, setType(EmbeddedDatabaseType) metodini EmbeddedDatabaseType.DERBY parametri bilan chaqiring.

Ichki ma'lumotlar bazasidan foydalanib, ma'lumotlarga kirish logikasini sinash

Ichki ma'lumotlar bazalari ma'lumotlarni tanlash uchun kodni sinashning oson usulini ta'minlaydi. Quyidagi misol - ichki ma'lumotlar bazasidan foydalanadigan ma'lumotlarga kirish integratsiya testi shabloni. Bu shablondan foydalanish bir martalik holatlar uchun foydali bo'lishi mumkin, agar ichki ma'lumotlar bazasini barcha test sinflarida takroran foydalanish kerak bo'lmasa. Ammo agar siz test to'plamida birgalikda foydalaniladigan ichki ma'lumotlar bazasini yaratmoqchi bo'lsangiz, Spring TestContext Framework dan foydalaning va ichki ma'lumotlar bazasini Spring'dagi ApplicationContext da bean sifatida konfiguratsiya qiling, yuqorida aytilganidek. Quyidagi listda test shabloni ko'rsatilgan:

Java
public class DataAccessIntegrationTestTemplate {
    private EmbeddedDatabase db;
    @BeforeEach
    public void setUp() {
        // standart skriptlar bilan to'ldirilgan rezident (operativ memoriya saqlash) HSQL ma'lumotlar bazasini yaratadi
        // classpath:schema.sql va classpath:data.sql
        db = new EmbeddedDatabaseBuilder()
                .generateUniqueName(true)
                .addDefaultScripts()
                .build();
    }
    @Test
    public void testDataAccess() {
        JdbcTemplate template = new JdbcTemplate(db);
        template.query( /* ... */ );
    }
    @AfterEach
    public void tearDown() {
        db.shutdown();
    }
}
Kotlin
class DataAccessIntegrationTestTemplate {
    private lateinit var db: EmbeddedDatabase
    @BeforeEach
    fun setUp() {
        // standart skriptlar bilan to'ldirilgan rezident (operativ memoriya saqlash) HSQL ma'lumotlar bazasini yaratadi
        // classpath:schema.sql va classpath:data.sql
        db = EmbeddedDatabaseBuilder()
                .generateUniqueName(true)
                .addDefaultScripts()
                .build()
    }
    @Test
    fun testDataAccess() {
        val template = JdbcTemplate(db)
        template.query( /* ... */)
    }
    @AfterEach
    fun tearDown() {
        db.shutdown()
    }
}

Ichki ma'lumotlar bazalari uchun unikal nomlar yaratish

Dasturchilar guruhi ko'pincha ichki ma'lumotlar bazalari bilan ishlashda xatolar yuzaga keladi, agar ularning test to'plami tasodifan bir xil ma'lumotlar bazasining qo'shimcha nusxalarini yaratishga harakat qilsa. Bu juda oson sodir bo'lishi mumkin, agar XML konfiguratsiya fayli yoki @Configuration annotatsiyalangan klass ichki ma'lumotlar bazasini yaratishga mas'ul bo'lsa va tegishli konfiguratsiya bir nechta test stsenariylarida bir test to'plamida (ya'ni bitta JVM jarayonida) takroran ishlatilsa, masalan, ichki ma'lumotlar bazalari integratsiya testlarida, qaysiki ApplicationContext konfiguratsiyasi faqat qaysi bin profillari faol ekaniga bog'liq.

Bunday xatolarni asosiy sababi shundaki, Spring'dagi EmbeddedDatabaseFactory fabrikasi (ichki ravishda XML namespace elementi <jdbc:embedded-database> va Java uchun EmbeddedDatabaseBuilder konfiguratsiyasi bilan ishlatiladi) ichki ma'lumotlar bazasi nomini testdb deb belgilaydi, agar boshqacha belgilanmagan bo'lsa. <jdbc:embedded-database> holatida, ichki ma'lumotlar bazasiga odatda beanning id ga teng nom tayinlanadi (ko'pincha dataSource kabi). Shunday qilib, keyingi harakatlar yangi ma'lumotlar bazasini yaratishga olib kelmaydi. Buning o'rniga, aynan bir xil JDBC tizimga kirish URL manzili takroran ishlatiladi va yangi ichki ma'lumotlar bazasini yaratishga urinishlar aslida bir xil konfiguratsiya asosida yaratilgan mavjud ichki ma'lumotlar bazasiga ishora qiladi.

Bu keng tarqalgan muammoni hal qilish uchun Spring Framework 4.2 da ichki ma'lumotlar bazalari uchun unikal nomlarni yaratish vositalari mavjud. Generatsiyalangan nomlardan foydalanish funksiyasini faollashtirish uchun quyidagi parametrlaridan birini ishlating.

  • EmbeddedDatabaseFactory.setGenerateUniqueDatabaseName()

  • EmbeddedDatabaseBuilder.generateUniqueName()

  • <jdbc:embedded-database generate-name="true" …​ >

Ichki ma'lumotlar bazasini qo'llab-quvvatlashni kengaytirish

Spring'da ichki ma'lumotlar bazasini qo'llab-quvvatlash vositalarini ikki yo'l bilan kengaytirish mumkin:

  • Yangi ichki ma'lumotlar bazasi turini qo'llab-quvvatlash uchun EmbeddedDatabaseConfigurer ni amalga oshirish orqali.

  • Ichki ma'lumotlar bazasiga ulanishlarni boshqarish uchun yangi DataSource realizatsiyasini qo'llab-quvvatlash uchun DataSourceFactory ni amalga oshirish orqali, masalan, ulanish hovuzini.

Biz sizni Spring hamjamiyatidagi GitHub Issues da kengaytmalar bo'yicha takliflaringizni taqdim etishga taklif qilamiz.

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