2014-09-10 25 views
7

Ich weiß, dass irgendwann zwischen Grails 1.X und Grails 2.X die Standardverbindungspooling-Bibliothek von commons-dbcp zu tomcat-dbcp geändert wurde.Definieren eines alternativen Verbindungspools in Grails 2.3.6

Jetzt versuche ich, entweder BoneCP oder HikariCP als Verbindungspooling-Bibliothek für meine Grails-Anwendung zu konfigurieren.

Allerdings sehe ich, this answer bietet eine Lösung, die nur für Grails 1.X gelten könnte.

Ich fand auch this Gist, aber wieder weiß ich nicht, auf welche Grails-Version es zutrifft.

Also ist es möglich, einen benutzerdefinierten Verbindungspool innerhalb einer Grails 2.3.6 Anwendung zu definieren? Vielen Dank!

+0

Dieser Gist sollte für jede Version von Grails funktionieren. –

+0

@JoshuaMoore True, aber es sollte wahrscheinlich aktualisiert werden, um 'grails.util.Holders' anstelle der veralteten individuellen Holder-Klassen zu verwenden. – rmlan

+0

@rmlan Einverstanden, aber der Ansatz ist immer noch gleich. –

Antwort

7

UPDATE: OK, so dass Sie tatsächlich benötigen, um Grails zu sagen nicht die Datenquellen zu bündeln, da HikariCP jetzt Sorge dafür zu nehmen ist.

Ich sah Verbindung Verrücktheit in meinen Apps, wenn ich das eingeschaltet habe. Also statt sagen:

pooled = false 

OK ja, @Joshua Moore hat Recht.

Ich habe versucht, es mit aktualisierten Grails-Methoden zu tun, und dies ist der relevante Abschnitt meiner resources.groovy Datei. Soweit ich das verstehe, werden die Konfigurationswerte in Datasource.groovy zur Laufzeit in resources.groovy gezogen, nachdem die Ziellaufzeitumgebung identifiziert wurde (development, test oder 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] 
    }) 
} 

Und dies ist der entsprechende Abschnitt meiner DataSource.groovy Konfiguration:

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

In meinem Fall ist es so ziemlich das gleiche für test und production Umgebungen. Vielen Dank!

+0

Wie laden Sie den Oracle-Treiber? Ich erhalte einen Fehler, wenn ich diese Methode verwende. Es scheint, dass der Oracle-Treiber nicht zu dem Zeitpunkt geladen wird, zu dem die App zur Ausführung von resources.groovy gelangt. 2016-02-19 09: 07: 10,767 [localhost-startStop-1] WARN util.DriverDataSource - Ein registrierter Treiber mit driverClassName = oracle.jdbc.OracleDriver wurde nicht gefunden, und versucht direkte Instanziierung. – Scott

+0

Ein weiterer Fehler in der Stack-Ablaufverfolgung: Fehler beim Instanziieren [com.zaxxer.hikari.HikariDataSource]: Konstruktor hat Ausnahme ausgelöst; verschachtelte Ausnahme ist com.zaxxer.hikari.pool.HikariPool $ PoolInitializationException: Ausnahme während der Initialisierung des Pools: HikariPool-0 - Verbindung ist nicht verfügbar, Zeitüberschreitung der Anforderung nach 6002ms. – Scott