问题
I'm having trouble with the configuration of multiple DataSources in Grails 2.5.1. I'm using PostgreSQL 9.4.4, H2DB and hibernate 4.3.10 with GGTS. I'm getting the 'Table "XX" not found; SQL statement...' message and after a debug with the console, I found that the Session is returning the wrong driver:
import teste.PTes;
PTes.withSession { hibernateSession ->
hibernateSession.getJdbcConnectionAccess().obtainConnection().getMetaData().getDriverName()
}
Result: H2 JDBC Driver
This domain class was supposed to run on a Session that uses the PostgreSQL driver. Here is the DataSource
dataSource {
pooled = true
jmxExport = true
driverClassName = "org.h2.Driver"
username = "sa"
password = ""
}
hibernate {
cache.use_second_level_cache = true
cache.use_query_cache=true
cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory' // Hibernate 4
}
// environment specific settings
environments {
development {
dataSource {
dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
logSql = true
}
dataSource_teste {
pooled = true
dialect="org.hibernate.dialect.PostgreSQLDialect"
driverClassName: 'org.postgresql.Driver'
username: 'teste'
password: 'teste'
url: 'jdbc:postgresql://localhost:5432/teste'
dbCreate: 'validate'
}
}
test {
dataSource {
dbCreate = 'create-drop'
url = "jdbc:postgresql://localhost:5432/teste;DB_CLOSE_ON_EXIT=FALSE"
}
}
production {
dataSource {
dbCreate = "update"
url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
properties {
// See http://grails.org/doc/latest/guide/conf.html#dataSource for documentation
jmxEnabled = true
initialSize = 5
maxActive = 50
minIdle = 5
maxIdle = 25
maxWait = 10000
maxAge = 10 * 60000
timeBetweenEvictionRunsMillis = 5000
minEvictableIdleTimeMillis = 60000
validationQuery = "SELECT 1"
validationQueryTimeout = 3
validationInterval = 15000
testOnBorrow = true
testWhileIdle = true
testOnReturn = false
jdbcInterceptors = "ConnectionState"
defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
}
}
dataSource_teste {
dialect: org.hibernate.dialect.PostgreSQL82Dialect
driverClassName: 'org.postgresql.Driver'
username: 'teste'
password: 'teste'
url: 'jdbc:postgresql://localhost:5432/teste;DB_CLOSE_ON_EXIT=FALSE'
dbCreate: 'update'
}
}
}
Here is the BuildConfig:
grails.servlet.version = "3.0" // Change depending on target container compliance (2.5 or 3.0)
grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports"
grails.project.work.dir = "target/work"
grails.project.target.level = 1.6
grails.project.source.level = 1.6
//grails.project.war.file = "target/${appName}-${appVersion}.war"
grails.project.fork = [
// configure settings for compilation JVM, note that if you alter the Groovy version forked compilation is required
// compile: [maxMemory: 256, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the test-app JVM, uses the daemon by default
test: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, daemon:true],
// configure settings for the run-app JVM
run: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the run-war JVM
war: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256, forkReserve:false],
// configure settings for the Console UI JVM
console: [maxMemory: 768, minMemory: 64, debug: false, maxPerm: 256]
]
grails.project.dependency.resolver = "maven" // or ivy
grails.project.dependency.resolution = {
// inherit Grails' default dependencies
inherits("global") {
// specify dependency exclusions here; for example, uncomment this to disable ehcache:
// excludes 'ehcache'
}
log "error" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
checksums true // Whether to verify checksums on resolve
legacyResolve false // whether to do a secondary resolve on plugin installation, not advised and here for backwards compatibility
repositories {
inherits true // Whether to inherit repository definitions from plugins
grailsPlugins()
grailsHome()
mavenLocal()
grailsCentral()
mavenCentral()
// uncomment these (or add new ones) to enable remote dependency resolution from public Maven repositories
//mavenRepo "http://repository.codehaus.org"
mavenRepo "http://download.java.net/maven/2/"
//repo for spring security
mavenRepo "http://repo.spring.io/milestone/"
//mavenRepo "http://repository.jboss.com/maven2/"
}
dependencies {
// specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes e.g.
// runtime 'mysql:mysql-connector-java:5.1.29'
runtime 'org.postgresql:postgresql:9.4-1201-jdbc4'
test "org.grails:grails-datastore-test-support:1.0.2-grails-2.4"
}
plugins {
// plugins for the build system only
build ":tomcat:7.0.55.3" // or ":tomcat:8.0.22"
// plugins for the compile step
compile ":scaffolding:2.1.2"
compile ':cache:1.1.8'
// asset-pipeline 2.0+ requires Java 7, use version 1.9.x with Java 6
compile ":asset-pipeline:2.2.3"
compile ":quartz:1.0.2"
compile ":joda-time:1.5"
compile ":XXXXXXX-plugin:0.1-SNAPSHOT"
// plugins needed at runtime but not for compilation
runtime ":hibernate4:4.3.10" // or ":hibernate:3.6.10.18"
runtime ":database-migration:1.4.0"
runtime ":jquery:1.11.1"
// Uncomment these to enable additional asset-pipeline capabilities
//compile ":sass-asset-pipeline:1.9.0"
//compile ":less-asset-pipeline:1.10.0"
//compile ":coffee-asset-pipeline:1.8.0"
//compile ":handlebars-asset-pipeline:1.3.0.3"
}
}
Here is the mapping used in the domain class:
static mapping = {
datasource 'teste'
table 'cd_pt'
id name: 'codPTes'
codPTes column: 'cod_p'
}
Anyone have a clue?
回答1:
Got this working by using the PSQL as primary DB and the H2 as secondary DB. Still don't know why or if the DataSource had errors in the configuration (I've spent 3 weeks on this, but it's surely possible).
来源:https://stackoverflow.com/questions/33549958/multiple-data-sources-configuration