كيف يمكنك الوصول إلى قاعدتي بيانات في Grails
-
09-06-2019 - |
سؤال
تجعل Grails من السهل جدًا تكوين مصادر البيانات لبيئات مختلفة (التطوير والاختبار والإنتاج) في ملف DataSources.groovy الخاص بها، ولكن يبدو أنه لا توجد إمكانية لتكوين مصادر بيانات متعددة في بيئة واحدة.ماذا أفعل إذا كنت بحاجة للوصول إلى عدة قواعد بيانات من نفس تطبيق Grails؟
المحلول 3
يوجد الآن مكون إضافي لـ Grails يتيح استخدام مصادر بيانات متعددة مباشرة مع طبقة GORM الخاصة بـ Grails:http://burtbeckwith.com/blog/?p=70
نصائح أخرى
يعد ربط قواعد البيانات المختلفة في فئات المجالات المختلفة أمرًا سهلاً للغاية في Grails 2.x.x.
على سبيل المثال
development {
dataSource {//DEFAULT data source
.
.
}
dataSource_admin { //Convention is dataSource_name
url = "//db url"
driverClassName = "oracle.jdbc.driver.OracleDriver"
username = "test"
password = 'test123'
}
dataSource_users {
}
}
يمكنك استخدام أي مصادر بيانات في فئات المجال الخاص بك عن طريق
class Role{
static mapping = {
datasource 'users'
}
}
class Product{
static mapping = {
datasource 'admin'
}
}
في حالة استخدام Grails 2.0 أو أعلى، ليست هناك حاجة للمكون الإضافي، فهو مدعوم محليًا.
http://www.grails.org/doc/latest/guide/single.html#multipleDatasources
يمكن لـ Grails 2.0 التعامل مع مصادر بيانات متعددة بدون مكون إضافي:
مثال مع مصدر بيانات مختلف لبيئات dev(h2 dataSource) وtest(mysql dataSource_mysql):
مصدر البيانات.رائع:
dataSource {
pooled = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
dataSource_mysql {
dialect = org.hibernate.dialect.MySQLInnoDBDialect
driverClassName = 'com.mysql.jdbc.Driver'
username = "user"
password = "pass"
url = "jdbc:mysql://mysqldb.com/DBNAME"
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
}
// environment specific settings
environments {
development {
dataSource {
configClass = HibernateFilterDomainConfiguration.class
dbCreate = "update" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:file:../devDb;MVCC=TRUE"
sqlLogging = true
}
}
test {
dataSource_mysql {
configClass = HibernateFilterDomainConfiguration.class
dbCreate = "create" // one of 'create', 'create-drop', 'update', 'validate', ''
sqlLogging = true
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000"
pooled = true
properties {
maxActive = -1
minEvictableIdleTimeMillis=1800000
timeBetweenEvictionRunsMillis=1800000
numTestsPerEvictionRun=3
testOnBorrow=true
testWhileIdle=true
testOnReturn=true
validationQuery="SELECT 1"
}
}
}
}
هل تريد حقا أن تفعل هذا؟من خلال تجربتي، السيناريو المعتاد هنا هو:
- يقوم التطبيق بإدارة البيانات الخاصة به في مخطط قاعدة البيانات الخاصة به
- في كثير من الأحيان، سيتطلب التطبيق بيانات من مصادر أخرى (على سبيل المثال، حتى لا يتم نسخ البيانات المرجعية ولصقها)
لقد كنت دائمًا أتمتع برفاهية جميع المخططات الموجودة في مثيل قاعدة البيانات الواحدة.ولذلك طلبي:
- لديه اتصال قاعدة بيانات واحد فقط - وهو المخطط الذي يمتلكه ولديه حق الوصول للقراءة/الكتابة
- تقوم التطبيقات الأخرى بتصدير بياناتها عبر طرق العرض
- يتمتع تطبيقي بحق الوصول للقراءة إلى طرق العرض هذه، ويحتوي على مرادف لطريقة العرض هذه مما يجعلها تبدو محلية
السبب وراء استخدام طرق العرض هو أن التطبيق الذي يعرض البيانات
- يعرف صراحة أنه يتم تصديره وما يتم تصديره
- لا يكشف عن البنية الداخلية للمخطط (لذلك إذا تغيرت البنية الداخلية، طالما أن العرض صحيح فلن تعرف التطبيقات المستهلكة)
لم أضطر في الواقع إلى القيام بذلك باستخدام تطبيق Grails، ولكن يجب أن ينجح هذا النهج.
هناك طريقة أخرى لمشاركة البيانات عبر التطبيقات وهي إنشاء خدمة ويب لعرض البيانات.Grails يجعل هذا الأمر سهلاً.
نأمل أن يكون ذلك مفيدًا، ولكن هذا النهج قد لا يكون قابلاً للتطبيق في جميع المواقف.
يبدو أن المنشور التالي هو أفضل مصدر للمعلومات حول هذا الموضوع:
كيفية الحصول على مصدر بيانات متعدد في الكأس
يتلخص في:
- تحديد مصدر البيانات 1 في DevelopmentDataSource
- تعريف datasource2 في Resources.xml
- اكتب DAO لـ CRUD لكائنات المجال باستخدام datasource2
- في hibernate.cfg.xml، قم بإدراج كافة كائنات المجال.
سيكون لمصدر البيانات الأول فقط طرق البحث الديناميكية.
إذا كان هذا استعلامًا بسيطًا حقًا، فأنت تبحث عنه ولا تمانع في عدم امتلاك ميزات ORM، فيمكنك استخدام Groovy SQL أو ميزات SQL الأصلية لـ Hibernate.