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:
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()
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:
@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();
}
}
@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:
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();
}
}
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
EmbeddedDatabaseConfigurerni amalga oshirish orqali. -
Ichki ma'lumotlar bazasiga ulanishlarni boshqarish uchun yangi
DataSourcerealizatsiyasini qo'llab-quvvatlash uchunDataSourceFactoryni amalga oshirish orqali, masalan, ulanish hovuzini.
Biz sizni Spring hamjamiyatidagi GitHub Issues da kengaytmalar bo'yicha takliflaringizni taqdim etishga taklif qilamiz.
GO TO FULL VERSION