2014-09-10 12 views
7

So che, ad un certo punto tra Grails 1.X e Grails 2.X, la libreria di pool di connessioni di default è stata modificata da commons-dbcp a tomcat-dbcp.Definizione di un pool di connessione alternativo in Grails 2.3.6

Ora, sto tentando di configurare BoneCP o HikariCP come libreria di pool di connessioni per l'applicazione Grails.

Tuttavia, vedo che this answer offre una soluzione che potrebbe essere applicata solo a Grails 1.X.

Ho trovato anche this Gist, ma ancora una volta, non so quale versione di Grails si applica a.

Quindi, è possibile definire un pool di connessioni personalizzate all'interno di un'applicazione Grails 2.3.6? Grazie!

+0

Questo Gist dovrebbe funzionare per qualsiasi versione di Grails. –

+0

@JoshuaMoore True, ma probabilmente dovrebbe essere aggiornato per utilizzare 'grails.util.Holders' al posto delle singole classi di Titolari deprecate. – rmlan

+0

@rmlan D'accordo, ma l'approccio è sempre lo stesso. –

risposta

7

UPDATE: OK quindi è in realtà bisogno di dire Grails non mettere in comune le origini dati, dal momento che HikariCP ora sta prendendo cura di questo.

Ho visto stranezze di connessione nelle mie app se ho lasciato quell'interruttore. Quindi diciamo:

OK sì, @Joshua Moore ha ragione.

Ho provato a farlo con i metodi aggiornati di Grails e questa è la sezione pertinente del mio file resources.groovy. Per quanto posso capire, i valori di configurazione in Datasource.groovy vengono inseriti in resources.groovy in fase di runtime, dopo che l'ambiente di runtime di destinazione è stato identificato (development, test o production).

def config = Holders.config 
def dataSources = config.findAll { 
    it.key.toString().contains("dataSource_") 
} 

dataSources.each { key, value -> 
    def ds = value 
    "${key}"(HikariDataSource, { bean -> 

    def hp = new Properties() 
    hp.username = ds.username 
    hp.password = ds.password 
    hp.connectionTimeout = 6000 
    hp.maximumPoolSize = 60 
    hp.jdbcUrl = ds.url 
    hp.driverClassName = ds.driverClassName 

    HikariConfig hc = new HikariConfig(hp) 
    bean.constructorArgs = [hc] 
    }) 
} 

E questa è la sezione dedicata mia configurazione DataSource.groovy:

// environment specific settings 
environments { 
    development { 
     dataSource_myapp1 { 
     pooled = false 
     username = "CONFIGURE_ME_EXTERNALLY" 
     password = "CONFIGURE_ME_EXTERNALLY" 
     driverClassName = 'oracle.jdbc.OracleDriver' 
     dialect = 'org.hibernate.dialect.Oracle10gDialect' 
     url = 'jdbc:oracle:thin:@MYDBHOST1:1521/MYSERVICEID1' 
     } 
     dataSource_myApp2 { 
     pooled = false 
     username = "CONFIGURE_ME_EXTERNALLY" 
     password = "CONFIGURE_ME_EXTERNALLY" 
     driverClassName = 'oracle.jdbc.OracleDriver' 
     dialect = 'org.hibernate.dialect.Oracle10gDialect' 
     url = 'jdbc:oracle:thin:@MYDBHOST2:1521/MYSERVICEID2' 
     } 
    } 
} 

Nel mio caso, è praticamente la stessa per test e production ambienti. Grazie!

+0

Come state caricando il driver Oracle? Ottengo un errore quando utilizzo questo metodo. Sembra che il driver Oracle non venga caricato dal momento in cui l'app arriva a resources.groovy in esecuzione. 2016-02-19 09: 07: 10,767 [localhost-startStop-1] WARN util.DriverDataSource - Driver registrato con driverClassName = oracle.jdbc.OracleDriver non è stato trovato, provando l'istanziazione diretta. – Scott

+0

Un altro errore nella traccia dello stack: Impossibile istanziare [com.zaxxer.hikari.HikariDataSource]: Il costruttore ha lanciato un'eccezione; l'eccezione annidata è com.zaxxer.hikari.pool.HikariPool $ PoolInitializationException: eccezione durante l'inizializzazione del pool: HikariPool-0 - Connessione non disponibile, richiesta scaduta dopo 6002 ms. – Scott

Problemi correlati