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?

È stato utile?

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'
   }
 }

Per maggiori dettagli guarda questo

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 è:

  1. Un'applicazione gestisce i propri dati nel proprio schema di database
  2. 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

  1. sa esplicitamente che viene esportato e cosa viene esportato
  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top