Come si accede a due database in Grails
-
09-06-2019 - |
Domanda
Grails semplifica la configurazione delle origini dati per diversi ambienti (sviluppo, test, produzione) nel suo file DataSources.groovy, ma sembra che non ci sia alcuna possibilità di configurare più origini dati in un unico ambiente.Cosa devo fare se ho bisogno di accedere a diversi database dalla stessa applicazione Grails?
Soluzione 3
Ora è disponibile il plug-in Grails che consente l'uso di più origini dati direttamente con il livello GORM di Grails:http://burtbeckwith.com/blog/?p=70
Altri suggerimenti
Collegare diversi database in diverse classi di dominio è molto semplice in Grails 2.x.x.
Per esempio
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 {
}
}
Puoi utilizzare qualsiasi origine dati nelle classi del tuo dominio tramite
class Role{
static mapping = {
datasource 'users'
}
}
class Product{
static mapping = {
datasource 'admin'
}
}
Se si utilizza Grails 2.0 o versione successiva, non è necessario il plugin, è supportato in modo nativo.
http://www.grails.org/doc/latest/guide/single.html#multipleDatasources
Grails 2.0 può gestire più origini dati senza plug-in:
Esempio con un'origine dati diversa per gli ambienti dev(h2 dataSource) e test(mysql dataSource_mysql):
DataSource.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"
}
}
}
}
Vuoi davvero farlo?Nella mia esperienza, il solito scenario qui è:
- Un'applicazione gestisce i propri dati nel proprio schema di database
- Spesso l'applicazione richiederà dati da altre fonti (ad esempio, per evitare che i dati di riferimento vengano copiati e incollati)
Normalmente ho sempre avuto il lusso di tutti gli schemi che risiedono su un'unica istanza del database.Pertanto, la mia richiesta:
- ha solo una connessione al database, che è allo schema di sua proprietà e ha accesso in lettura/scrittura
- le altre applicazioni "esportano" i propri dati tramite visualizzazioni
- la mia applicazione ha accesso in lettura a tali visualizzazioni e ha un sinonimo per tale visualizzazione facendola apparire locale
Il motivo dietro l'utilizzo delle visualizzazioni è che l'applicazione che espone i dati
- sa esplicitamente che viene esportato e cosa viene esportato
- non espone la struttura interna dello schema (quindi se la struttura interna cambia, purché la visualizzazione sia corretta le app che la utilizzano non lo sanno)
In realtà non ho dovuto farlo con un'applicazione Grails, ma l'approccio dovrebbe funzionare.
Un altro approccio alla condivisione dei dati tra applicazioni consiste nel creare un servizio Web per esporre i dati.Grails lo rende facile.
Spero che questo aiuti, ma questo approccio potrebbe non essere applicabile a tutte le situazioni.
Il seguente post sembra essere la migliore fonte di informazioni sull'argomento:
Come ottenere multi-dataSource in Grails
Si riduce a:
- Definire datasource1 in DevelopmentDataSource
- Definire datasource2 in resources.xml
- Scrivere un DAO per CRUD degli oggetti del dominio utilizzando datasource2
- In hibernate.cfg.xml, elenca tutti gli oggetti del dominio.
Solo la prima origine dati avrà metodi di ricerca dinamica.
Se stai cercando una query davvero semplice e non ti dispiace non avere le funzionalità ORM, potresti utilizzare Groovy SQL o le funzionalità SQL native di Hibernate.