2015-06-16 3 views
1

Учитывая необходимость извлечения данных из нескольких сред (prodA, prodB и т. Д.), Я создал определенные записи dataSource в файле конфигурации DataSource.Коммутатор Gorm для разных источников данных во время выполнения

environments { 
    development { 
     dataSource_prodA_oracle { 
      dbCreate = "none" 
      url = "jdbc:oracle:thin:@//prodA.box.url.com:1521/prodADB" 
      driverClassName = "oracle.jdbc.OracleDriver" 
      username = "prodA_user" 
      password = "horribly_encoded_password" 
      passwordEncryptionCodec = PropertiesCodec 
     } 
     dataSource_prodB_oracle { 
      dbCreate = "none" 
      url = "jdbc:oracle:thin:@//prodb.box.url.com:1521/prodBDB" 
      driverClassName = "oracle.jdbc.OracleDriver" 
      username = "prodB_user" 
      password = "another_horribly_encoded_password" 
      passwordEncryptionCodec = PropertiesCodec 
     } 
    } 
} 

Горм Домен Класс:

class Foo { 
    static mapping = { 
     version false 
     datasource 'prodA_oracle' //needs dynamic datasource behavior 
     createdDate type: Date, column: 'created_date' 
     id generator:'assigned', name:'fooId', type:'string' 
    } 
    static constraints = { 
    } 
    String fooId 
    String region 
    Date createdDate 
} 

В приведенном выше класса домена, источник данных жестко к одному из конкретной среды источника данных (PRODA или prodB или даже какой-либо другой среды).

Во время выполнения, мне нужно использовать этот класс домена стрелять findBy метод против конкретной базы данных на основе параметров запроса (который определяет тип среды (PRODA против prodB и т.д.).

Как переключить класс домена использовать конкретный источник данные во время выполнения?

ответ

2

вы можете предоставить список источников данных, которые необходимо подключить через этот домен, как

static mapping = { 
    datasources(['lookup', 'auditing']) 
} 

или сделать эту область доступной для всех данных кислых цы, как

static mapping = { 
    datasources 'ALL' 
} 

И вы можете запросить от любого источника данных, упоминая его имя в запросе, как

def result1 = Foo.lookup.findByFoo(foo) 
def result2 = Foo.auditing.findByFoo(foo) 

Ref. multipleDatasources

+3

Который на самом деле можно использовать как: 'def result1 = Foo." $ {Params.datasourcename} ". FindByFoo (foo)', чтобы сделать его еще более динамичным. –

+1

Это одна из причин, почему Grails - это отличная структура. – cantoni

+0

как сохранить новый экземпляр в выбранном источнике данных? –

Смежные вопросы