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
Odpowiedz
Obecnie Grails wtyczki, która umożliwia korzystanie z wielu datasources bezpośrednio z warstwą GORM Grails': http://burtbeckwith.com/blog/?p=70
Zauważ, że nie jest to już potrzebne od wersji Grails 2.0 (obsługa wielu źródeł danych jest wbudowana w rdzeń) – Peter
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.
Dlatego łączenie z odpowiedziami jest złym pomysłem. –
Czy na pewno chcesz to zrobić? Z mojego doświadczenia wynika, zwykle jest tutaj scenariusz:
- Aplikacja zarządza własne dane w swoim schemacie bazy danych
- 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
- wie jednoznacznie, że jest eksportowany, a eksportowany plik
- 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.
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
-1 za brak odpowiedzi na pierwotne pytanie, istnieje wiele scenariuszy inżynieryjnych i komercyjnych tam, gdzie jest to konieczne. –
+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
Jeśli używasz Grails w wersji 2.0 lub wyższej, wtyczka nie jest potrzebna, jest obsługiwana natywnie.
http://www.grails.org/doc/latest/guide/single.html#multipleDatasources
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"
}
}
}
}
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'
}
}
To powinna być zaakceptowana odpowiedź. –
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
@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
Wiem, że to stary post, ale proszę zmienić przyjętą odpowiedź @ Sushanth CS, ponieważ tak właśnie działa Grails. –
http://stackoverflow.com/a/36647714/2245264 ma odpowiedź na to. –