كيف يمكنك الوصول إلى قاعدتي بيانات في Grails

StackOverflow https://stackoverflow.com/questions/41018

  •  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"
            }
        }
    }
}

هل تريد حقا أن تفعل هذا؟من خلال تجربتي، السيناريو المعتاد هنا هو:

  1. يقوم التطبيق بإدارة البيانات الخاصة به في مخطط قاعدة البيانات الخاصة به
  2. في كثير من الأحيان، سيتطلب التطبيق بيانات من مصادر أخرى (على سبيل المثال، حتى لا يتم نسخ البيانات المرجعية ولصقها)

لقد كنت دائمًا أتمتع برفاهية جميع المخططات الموجودة في مثيل قاعدة البيانات الواحدة.ولذلك طلبي:

  • لديه اتصال قاعدة بيانات واحد فقط - وهو المخطط الذي يمتلكه ولديه حق الوصول للقراءة/الكتابة
  • تقوم التطبيقات الأخرى بتصدير بياناتها عبر طرق العرض
  • يتمتع تطبيقي بحق الوصول للقراءة إلى طرق العرض هذه، ويحتوي على مرادف لطريقة العرض هذه مما يجعلها تبدو محلية

السبب وراء استخدام طرق العرض هو أن التطبيق الذي يعرض البيانات

  1. يعرف صراحة أنه يتم تصديره وما يتم تصديره
  2. لا يكشف عن البنية الداخلية للمخطط (لذلك إذا تغيرت البنية الداخلية، طالما أن العرض صحيح فلن تعرف التطبيقات المستهلكة)

لم أضطر في الواقع إلى القيام بذلك باستخدام تطبيق Grails، ولكن يجب أن ينجح هذا النهج.

هناك طريقة أخرى لمشاركة البيانات عبر التطبيقات وهي إنشاء خدمة ويب لعرض البيانات.Grails يجعل هذا الأمر سهلاً.

نأمل أن يكون ذلك مفيدًا، ولكن هذا النهج قد لا يكون قابلاً للتطبيق في جميع المواقف.

يبدو أن المنشور التالي هو أفضل مصدر للمعلومات حول هذا الموضوع:

كيفية الحصول على مصدر بيانات متعدد في الكأس

يتلخص في:

  • تحديد مصدر البيانات 1 في DevelopmentDataSource
  • تعريف datasource2 في Resources.xml
  • اكتب DAO لـ CRUD لكائنات المجال باستخدام datasource2
  • في hibernate.cfg.xml، قم بإدراج كافة كائنات المجال.

سيكون لمصدر البيانات الأول فقط طرق البحث الديناميكية.

إذا كان هذا استعلامًا بسيطًا حقًا، فأنت تبحث عنه ولا تمانع في عدم امتلاك ميزات ORM، فيمكنك استخدام Groovy SQL أو ميزات SQL الأصلية لـ Hibernate.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top