DataSource dan Foydalanish
Spring ma'lumotlar bazasi bilan ulanishni DataSource orqali ta'minlaydi. DataSource - bu JDBC spetsifikatsiyasining qismi bo'lib, umumlashtirilgan ulanishlar fabrikasini ifodalaydi. Bu konteyner yoki freymvorkka koddan ulanishlarni pooling va transaktsiyalarni boshqarish muammolarini yashirish imkonini beradi. Dasturchi sifatida sizga ma'lumotlar bazasiga qanday ulanish kerakligi haqida batafsil bilish shart emas. Buning uchun ma'suliyatli administrator ma'lumot manbasini o'rnatadi. Ko'p ehtimol bilan, siz ikkala rolni ham bajarishingiz mumkin, chunki kodni ishlab chiqishda va sinab ko'rishda oldingi bosqichda bo'lishingiz mumkin, ammo ishlab chiqaruvchi ma'lumotlar manbasi qanday o'rnatilganini bilishingiz shart emas.
Agar siz Springda JDBC darajasidan foydalansangiz, JNDIdan ma'lumot manbasini olishingiz yoki uchinchi tomon tomonidan taqdim etilgan ulanishlar pooling implementatsiyasi yordamida o'zingizni sozlashingiz mumkin. An'anaviy variantlar Apache Commons DBCP va C3P0 bilan bean-based DataSource , zamonaviy JDBC pooling variantlari uchun HikariCP'ni ko'rib chiqing, uning builder-based API orqali.
DriverManagerDataSource va
SimpleDriverDataSource (Spring taqsimotiga kiradi) faqat test maqsadlarida foydalanilishi kerak! Bu variantlar poolingni ta'minlamaydi va bir nechta ulanish so'rovlarini amalga oshirishda yomon ishlaydi.
Keyingi qismda Springdagi DriverManagerDataSourcening implementatsiyasi keltirilgan. Boshqa DataSource variantlari keyinchalik ko'rib chiqiladi.
DriverManagerDataSourceni sozlash uchun:
-
DriverManagerDataSourcebilan ulanishni o'rnating, xuddi odatdagi JDBC ulanishini o'rnatgandek. -
JDBC driver klassining to'liq nomini ko'rsating, shunda
DriverManagerdriver klassini yuklay oladi. -
Turli JDBC driverlar uchun farqli bo'lgan URL-manzilni ko'rsating. (To'g'ri qiymatni sizning driver dokumentatsiyasida topasiz).
-
Ma'lumotlar bazasiga ulanish uchun foydalanuvchi nomi va parolni kiriting.
Quyidagi misol DriverManagerDataSourceni Java'da qanday sozlashni ko'rsatadi:
DriverManagerDataSource dataSource = new DriverManagerDataSource();
// Drayver klassi nomini belgilash
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
// URL manzili
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
// Foydalanuvchi nomi
dataSource.setUsername("sa");
// Parol
dataSource.setPassword("");
val dataSource = DriverManagerDataSource().apply {
// Drayver klassi nomini belgilash
setDriverClassName("org.hsqldb.jdbcDriver")
// URL manzili
url = "jdbc:hsqldb:hsql://localhost:"
// Foydalanuvchi nomi
username = "sa"
// Parol
password = ""
}
Quyidagi misol XML konfiguratsiyasini ko'rsatadi:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>
Quyidagi ikkita misolda DBCP va C3P0 uchun asosiy ulanish va konfiguratsiya ko'rsatilgan. Pooling funksiyalarini boshqarishga yordam beradigan boshqa variantlar haqida bilish uchun, ulanish pooling implementatsiyalari bo'yicha tegishli mahsulotlar dokumentatsiyasiga murojaat qiling.
Quyidagi misol DBCP konfiguratsiyasini ko'rsatadi:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>
Quyidagi misol C3P0 konfiguratsiyasini ko'rsatadi:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClassName}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>
DataSourceUtils dan foydalanish
DataSourceUtils klassi - bu JNDI'dan ulanishlarni o'rnatish va kerak bo'lganda ulanishlarni yopish uchun statik metodlarni taqdim etuvchi qulay va to'liq funksiyaga ega yordamchi klass. Bu DataSourceTransactionManager kabi streaming ulanishlarni qo'llab-quvvatlaydi.
SmartDataSource ning implementatsiyasi
SmartDataSource interfeysi relatsion ma'lumotlar bazasiga ulanishni ta'minlay oladigan klasslar tomonidan amalga oshirilishi kerak. Bu DataSource interfeysini kengaytiradi, uni ishlatadigan klasslarga muayyan operatsiyadan so'ng ulanishni yopish kerakligini so'rash imkonini beradi. Agar siz ulanishni qayta ishlatishingiz kerakligini bilsangiz, bu foydali bo'ladi.
AbstractDataSource ni kengaytirish
AbstractDataSource - bu Spring ma'lumotlar bazasi uchun DataSource ning abstract asosiy klassidir. Bu barcha DataSource implementatsiyalari uchun umumiy bo'lgan kodni amalga oshiradi. O'zingizning DataSource implementatsiyangizni yozsangiz, AbstractDataSource klassini kengaytirishingiz kerak.
SingleConnectionDataSource dan foydalanish
SingleConnectionDataSource klassi - bu SmartDataSource interfeysining realizatsiyasi bo'lib, bir Connection ni o'rab, har foydalanishdan so'ng yopilmaydi. Bu ko'p oqimli ishlashni qo'llab-quvvatlamaydi.
Agar biron-bir mijoza kodi closeni chaqirsa, chiquvchi manbalar vositalari kabi pool mavjudligi taxmin qilsangiz, suppressClose xususiyatini true ga o'rnatishingiz kerak. Bu parametr fizika ulanishni o'raydigan proxyni qaytaradi. Diqqat qiling: endi uni Oracle yoki o'xshash obyektdan olingan o'zining Connection ga aylantirib bo'lmaydi.
SingleConnectionDataSource ko'proq test klassidir. Umuman, bu app-serverdan tashqarida kodni oddiy JNDI muhiti bilan sinashga imkon beradi. DriverManagerDataSource'dan farqli o'laroq, bir xil ulanishni doimo ishlatadi va ortiqcha fizika ulanishlarini yaratishdan qochadi.
DriverManagerDataSource dan foydalanish
DriverManagerDataSource standarti DataSource interfeysining realizatsiyasi bo'lib, odatiy JDBC driverni bean xususiyatlari orqali sozlaydi va har safar yangi Connection qaytaradi.
Bu realizatsiya test va kontainersiz Java EE muhitlarida foydali bo'lib, IoC konteyneridagi DataSource bean sifatida yoki oddiy JNDI muhit bilan birgalikda ishlatiladi. Connection.close() chaqiruvi ulanishni yopadi, shuning uchun DataSource orqali mos keladigan har qanday saqlash vositasi ishlashi kerak. Ammo JavaBean asosidagi poolinglarni (commons-dbcp kabi) ishlatish test muhitida ham juda oddiy, shuning uchun deyarli har doim bunday pooling DriverManagerDataSource'dan ko'ra yaxshiroqdir.
TransactionAwareDataSourceProxy dan foydalanish
TransactionAwareDataSourceProxy - bu ma'sadli DataSource uchun proxy. Proxy ma'sadli DataSource'ni o'rab, Spring yordamida boshqariladigan transaktsiyalar bilan mosligini oshiradi. Bu jihatdan u Java EE serveri tomonidan taqdim etilgan JNDI transaktsion DataSource'ga o'xshaydi.
DataSource interfeysining standart realizatsiyasini yuborish kerak bo'lsa, bundan mustasno. Bu holda, siz ushbu kodni ishlatishda davom etishingiz mumkin va o'sha paytda Spring yordamida boshqariladigan transaktsiyalarda ushbu kod ishtirokini ta'minlashingiz mumkin. Odatda, resurslarni boshqarish uchun yuqori darajadagi abstraksiyalardan foydalanib, o'z yangi kodingizni yozish afzalroq, masalan,
JdbcTemplate yoki
DataSourceUtils.
Batafsil ma'lumotni TransactionAwareDataSourceProxy javadocda ko'ring.
DataSourceTransactionManager dan foydalanish
DataSourceTransactionManager klassi - bu alohida JDBC ma'lumot manbalari uchun PlatformTransactionManager ning realizatsiyasi. U ko'rsatilgan ma'lumotlar manbasidan joriy bajarilayotgan oqimga JDBC ulanishni bog'laydi, bu potentsial ravishda har bir ma'lumotlar manbasi uchun bitta oqim ulanishidan foydalanish imkoniyatini beradi.
Kod ma'lumotlarni DataSourceUtils.getConnection(DataSource) orqali olish kerak, Java EE'dagi standart DataSource.getConnection o'rniga. U SQLExceptions dan ko'ra org.springframework.dao dan o'rganilmagan istisnolarni chiqaradi. Frameworkning barcha klasslari (masalan, JdbcTemplate) bu strategiyani yashirin ravishda qo'llaydi. Agar bu transaktsiya menejeri bilan qidiruv strategiyasidan foydalanilmasa, u odatdagidek ishlaydi. Shunday qilib, baribir uni ishlatishingiz mumkin.
DataSourceTransactionManager klassi maxsus izolyatsiya darajalari va taymer qiymatlarini qo'llab-quvvatlaydi, ular JDBC buyruq so'rovlarining mos qiymatlarini qo'llaydi. Oxirgi variantni qo'llab-quvvatlash uchun, kod JdbcTemplatedan foydalanishi kerak yoki har bir qurilgan buyruq uchun DataSourceUtils.applyTransactionTimeout(..) metodini chaqirishi kerak.
Agar JtaTransactionManager o'rniga bitta resursdan foydalanayotgan bo'lsangiz, ushbu implementatsiyani ishlatishingiz mumkin, chunki u JTA ni qo'llab-quvvatlashni talab qilmaydi. Agar siz kerakli qidiruv ulanishi shablonlariga amal qilsangiz, ularning o'rtasida o'tish faqat konfiguratsiya masalasidir. JTA custom qilingan izolyatsiya darajalarini qo'llab-quvvatlamaydi.
GO TO FULL VERSION