2008-09-03 15 views
20

Grails bardzo ułatwia konfigurowanie źródeł danych dla różnych środowisk (programowanie, testowanie, produkcja) w swoim pliku DataSources.groovy, ale wydaje się, że nie ma możliwości konfigurowania wielu źródeł danych w jednym środowisku . Co mam zrobić, jeśli potrzebuję uzyskać dostęp do kilku baz danych z tej samej aplikacji Grails?Jak uzyskać dostęp do dwóch baz danych w Grails

+0

Wiem, że to stary post, ale proszę zmienić przyjętą odpowiedź @ Sushanth CS, ponieważ tak właśnie działa Grails. –

+0

http://stackoverflow.com/a/36647714/2245264 ma odpowiedź na to. –

Odpowiedz

9

Obecnie Grails wtyczki, która umożliwia korzystanie z wielu datasources bezpośrednio z warstwą GORM Grails': http://burtbeckwith.com/blog/?p=70

+7

Zauważ, że nie jest to już potrzebne od wersji Grails 2.0 (obsługa wielu źródeł danych jest wbudowana w rdzeń) – Peter

-1

Poniższy post wydaje się być najlepszym źródłem informacji na ten temat:

How to get mutli-dataSource in grails

To sprowadza się do:

  • Definiowanie DataSource1 w DevelopmentDataSource
  • Definiowanie datasource2 zasobów .xml
  • Napisz DAO dla CRUD obiektów domeny przy użyciu źródła danych2
  • W pliku hibernate.cfg.xml wyświetl wszystkie obiekty domeny.

Tylko pierwsze źródło danych będzie miało dynamiczne metody wyszukiwania.

Jeśli jest to bardzo proste zapytanie, które Cię interesuje i nie masz nic przeciwko temu, że nie masz funkcji ORM, możesz użyć Groovy SQL lub natywnych funkcji SQL Hibernate.

+1

Dlatego łączenie z odpowiedziami jest złym pomysłem. –

1

Czy na pewno chcesz to zrobić? Z mojego doświadczenia wynika, zwykle jest tutaj scenariusz:

  1. Aplikacja zarządza własne dane w swoim schemacie bazy danych
  2. Często aplikacja będzie wymagać danych z innych źródeł (na przykład, więc dane odniesienia nie zostanie skopiowany i wklejony)

Zazwyczaj zawsze miałem luksus wszystkich schematów rezydujących w jednej instancji bazy danych. Dlatego mój wniosek:

  • ma tylko jedno połączenie z bazą danych - co jest na schemacie jest właścicielem i ma dostęp odczytu/zapisu
  • innymi aplikacjami „wywóz” ich danych przez widoki
  • mój wniosek czytać Dostęp do tych poglądów, i synonimem tego poglądu co wydaje lokalny

powodem korzystania widoki jest tak, że aplikacja, która naraża dane

  1. wie jednoznacznie, że jest eksportowany, a eksportowany plik
  2. nie ujawnia wewnętrznej struktury schematu (więc jeśli struktura wewnętrzna ulegnie zmianie, o ile widok jest poprawny, aplikacje konsumujące go nie znają)

Nie musiałem tego robić z aplikacją Grails, ale podejście powinno działać.

Innym sposobem udostępniania danych w różnych aplikacjach jest utworzenie usługi internetowej w celu odsłonięcia danych. Grails ułatwia to.

Nadzieję, że pomaga, ale to podejście może nie mieć zastosowania we wszystkich sytuacjach.

+0

Jeśli nadal szukasz tego: Używanie więcej niż jednego źródła danych w projekcie Grails - http: //www.crjug .org /? q = node/103 – Paul

+3

-1 za brak odpowiedzi na pierwotne pytanie, istnieje wiele scenariuszy inżynieryjnych i komercyjnych tam, gdzie jest to konieczne. –

+0

+1 za podniesienie doskonałego punktu - zarządzanie wieloma źródłami danych jest bardzo denerwujące, szczególnie jeśli już napisałeś kod aplikacji, który zakłada, że ​​klasa domeny, do której chcesz uzyskać dostęp, jest częścią lokalnej bazy danych. Pozwala to zaoszczędzić ból głowy podczas przechodzenia przez kod, usuwając relacje w domenie i ręcznie ustawiając klasy asocjacji, aby odwzorować wiele skojarzeń. Strategią, która działa dobrze dla nas, jest to, co Paul zasugerował: zachowanie lokalnego "synonimu", a następnie zbadanie różnych sposobów, które mogą być zsynchronizowane ze zdalną bazą danych. – mikermcneil

2

Grails 2.0 może obsługiwać wiele źródeł danych bez wtyczki:

przykład z innego źródła danych do dev (H2 Datasource) oraz testu (MYSQL dataSource_mysql) Środowisko:

źródło danych .groovy:

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

Podłączanie różnych d bazy w różnych klasach domen są bardzo łatwe w Grails 2.x.x.

np

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 { 

    } 
} 

Można używać żadnych źródeł danych w klasach domen przez

class Role{ 
    static mapping = { 
     datasource 'users' 
    } 
} 

class Product{ 
    static mapping = { 
     datasource 'admin' 
    } 
} 

For more details look at this

+2

To powinna być zaakceptowana odpowiedź. –

+1

Od wersji 2.5.x to się zmieniło. Zgodnie z instrukcją: http://docs.grails.org/latest/guide/single.html#_multiple_datasources "Jeśli istnieje więcej niż jeden" DataSource "w aplikacji, jest teraz' dataSources {...} blok konfiguracji, który zawierał je wszystkie Wcześniej użyto wiele deklaracji źródła danych, z podkreśleniem i sufiksem dodatkowych źródeł danych, np. 'dataSource_lookup {...}'. – Pere

+0

@Nie jest to poprawne: http: //docs.grails. org/2.5.6/guide/single.html # multipleDatasources - jak widzisz, jest to nadal notacja podkreślenia. Prawdopodobnie odnosisz się do grails 3.x.x – codewandler

Powiązane problemy